插入排序(希尔排序)

直接插入排序


将数组分为有序区和无序区,开始时第一个元素就是有序区,与第二个元素比较,第一二元素排好序后,再将第三个元素与前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 }

 

posted @ 2019-10-27 19:48  捞的不谈  阅读(192)  评论(0编辑  收藏  举报