直接插入排序
将数组分为有序区和无序区,开始时第一个元素就是有序区,与第二个元素比较,第一二元素排好序后,再将第三个元素与前2个元素比较插入到合适的位置。后面依次操作。
0下标的元素作为比较元素(哨兵),从下标1开始进行排序。将待插入元素赋值给哨兵,让哨兵与前面有序的元素一一比较,寻找合适的位置,插入新的元素。
1 void insertSort(int num[]){ 2 3 int i,j; 4 for(i=2;i<n;i++){ 5 j = i-1; //i的前一个位置 6 num[0] = num[i]; //num[0]是待插入元素,作为比较和交换,书上称为哨兵 7 while(num[0]<num[j]){ //待插入元素与前面的有序区进行比较 8 num[j+1] = num[j]; //该元素后移,为元素的插入腾出空间 9 j--; //j自减,插入元素寻找合适的位置插入 10 } 11 num[j+1] = num[0]; //待插入元素插到该位置 12 } 13 14 }
希尔排序
1 void shell(int num[]){ 2 3 int i,d; 4 d = n/2; //称为步长,可除3或除2 5 for(i=d;i>0;i--){ 6 shellSort(num,i); //每次步长减一 7 } 8 9 } 10 11 void shellSort(int num[],int det){ 12 13 int i,j,k; 14 for(i=1;i<=det;i++) //从第1个元素开始 15 for(j=i+det;j<n;j=j+det){ //与普通插入排序思路一样 16 k = j - det; //只不过每次增减量为步长 17 num[0] = num[j]; 18 while(num[0]<num[k]){ 19 num[k+det] = num[k]; 20 k -= det; 21 } 22 num[k+det] = num[0]; 23 } 24 25 }