先上代码。
/** ** @author:hushunfeng ** 直接插入排序 从小到大进行排列 */ #include<stdio.h> void insertSort(int *array,int arraySize) { //用于缓存被插入数 int temp; int i; int j; for(i=1;i<arraySize;i++) { //将被插入数先进行缓存 temp = array[i]; //将被插数和“已排好序的各个元素”进行比较 //比较顺序为从后往前 //一旦不符合if语句内的条件,跳出for循环 for(j=i-1;j>=0;j--) { if(temp<array[j]) { array[j+1] = array[j]; } else break; //将temp中的数据放到相应的位置 array[j] = temp; } } } void display(int *array,int num) { int i; for(i=0;i<num;i++) { printf("%d ",array[i]); } } void main() { int array[8] = {4,10,9,7,8,3,6,5}; insertSort(array,8); display(array,8); }
注意点:将被插数和“已排好序的各个元素”进行比较只能是从后往前!不能从前往后!!理由:被插数的内容是已经被缓存起来了,所以说可以用挨着它的元素里的数据刷新掉这个被插数内容,如果从前往后,有用的,没有缓存着的数据被更改刷新了。
直接插入排序的思路:
1. 从第一个元素开始,该元素可以认为已经被排序
2. 取出下一个元素,在已排序序列中从后向前扫描
3. 如果已排序中的元素大于/小于新元素,将该排序中的这个元素后移(其实并不是大批量数据的移动,一次只移动一个位置,将其移动到下一个位置)
4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
5. 将新元素插入到移动后腾空出来的位置
6. 重复步骤2~5