int *zixieSort(int *array, int n) {
/*直接插入排序自写版*/
int j = 0;
int i = 0;
int tem = 0;
int k = 0;
int flag;
//2,4,3,1,7,6,5,8,9,0
for (i = 1; i < n; ++i) {
tem = array[i];
for (j = 0; j < i; ++j) {
if (array[i] < array[j]) {
k = j;
flag = 1;
break;
}
}
if (flag) {
for (int l = i; l > j; --l) {
array[l] = array[l - 1];
}
array[k] = tem;
flag = 0;
}
}
return array;
}
int *Sort(int *array,int n){
/*直接插入排序精简版*/
int i;
int j;
int tmp; //哨兵 存储每轮排序时无序列的第一个数
for(i = 1; i < n; i++){ //i是无序列的索引
tmp = array[i];
j = i; //j是有序列的索引
while( j > 0 && array[j - 1] > tmp){ //有序列中从后往前如果比tmp大
//数据向后移动一个,j--,继续比较
array[j] = array[j - 1];
j--;
} //找到了标记位并空余出来
array[j] = tmp; //插入tmp
}
return array;
}
int main() {
int a[] = {2,4,3,1,7,6,5,8,9,0};
printf("乱序数组:\n");
printf("2,4,3,1,7,6,5,8,9,0\n");
printf("自写版直接插入排序后:\n");
int *b = zixieSort(a,10);
for (int i = 0; i < 10; ++i) {
printf("%d ",b[i]);
}
printf("\n精简版直接插入排序后:\n");
b = Sort(a,10);
for (int i = 0; i < 10; ++i) {
printf("%d ",b[i]);
}
return 0;
}
将待排序数组分成两部分 ,一部分为有序数列,一部分为无序数列,每轮排序将无序数列的第一个数a与有序数列中的所有数进行比较,找到合适位置插入(如果需要后移数据就后移,留出空位),将a插入到无序数列中。进行n-1轮比较插入,就可以将数据排好。
如无序数组 2,4,3,1,7,6,5,8,9,0
升序排序
第一轮 排序:一般将4作为无序数列第一个数(4以及以后都属无序列的数据),与有序数列中的2进行比较,比它大,已经是有序的了,不做插入动作。
第二轮 排序:将3作为无序数列第一个数(此时无序数列就是3,1,7,6,5,8,9,0),与有序数列中的每一个数比较(此时有序数列为2,4),插入到2与4之间,4需要向后移动一个,覆盖数据3,将3插入(覆盖)到数据4原来的位置。
第三轮 排序:将1作为无序数列第一个数(此时无序数列就是1,7,6,5,8,9,0),与有序数列中的每一个数比较(此时有序数列为2,3,4),2,3,4一次向后移动一位,将1,插入到2原来的位置。
…
第n-1轮:…
这样就排好了数据。
简单地说,因为每次无序数列的第一个数都要与有序数列进行比较插入此动作时间复杂度约等于O(n),然后还要进行n-1轮排序,所以总的时间复杂度约为O(n*(n-1))----->O(n^2).
注:第一个自写版是属于只看算法思想写的,需要的同学最好参考第二个精简版。本文章用于学习和理解,如有错误之处请指出和谅解,谢谢。