简单C排序算法系列——Insertion Sort插入算法前言:简单C语言排序算法,其他持续更新点击直达(1)冒泡排序算法(2)选择排序算法
Author: Nirvana Of Phoenixl Proverbs
For you:There is no doubt that good things will always come, and when it comes late, it can be a surprise.
代码后解析过程
#includevoid insertion_sort(int arr[], int length) { int i = 0; int j = 0; int temp = 0; for(i = 1; i temp = arr[i]; //(1) for(j = i; j>0&&arr[j-1]>temp; j--) //(2) { arr[j] = arr[j-1]; //(3) } arr[j] = temp; //(4) } } int main() { int arry[] = {32, 23, 54, 48, 78, 12, 10, 62, 5, 25}; int len = (int)sizeof(arry)/sizeof(*arry); int i; insertion_sort(arry, len); for(i = 0; i < len; i++) { printf(" %d",arry[i]); } return 0 ; }
通俗总结帮助理解:
上述代码解析,注意从数组第二个元素开始排序,外循环根据数组长度来定。
代码(1)中插入排序过程当中也是通过对比数字大小进行,将数组元素从后向前进行扫描满足条件就插入,此时会造成当前排序对比元素位置被替换成满足条件的元素,因此需要将目前未排序的元素的第一个元素保存起来;
代码(2)两个数字进行对比满足j>0(数组下标不能未负值)逻辑与(&&)上当前数字的前一个数字比较(外循环递增,内循环递减保证,也就是体现从后向前),如果当前值比它的前一个值小,则满足条件执行(3)将执行arr[j] = arr[j-1]也就时用前一个值j-1(较大值)覆盖掉当前值j(较小值),此时当前值j已经被覆盖掉了,但是不能丢掉,因为还排序后面数字,这也就是为什么要保存当前值的原因(注意这里不是交换,交换得有中间变量,如果不保存就会丢失数据)
代码(4),如果满足条件的情况下,则当位置的值变成较大的值,j递减到了当前值的前一个,用原来保存的值temp放到前一个位置达到换位的目的。如果条件不满足,则直接赋值即可。



