12. {
13. a[j]=a[j-1];
14. }
15. a[j]=temp;
16. }
17. print(a,size);
18.}
折半插入排序:
折半插入排序(binaryinsertionsort)是对插入排序算法的一种改进,由于排序算法过程中,就是不断的依次将元素插入前面已排好序的序列中。
由于前半部分为已排好序的数列,这样我们不用按顺序依次寻找插入点,可以采用折半查找的方法来加快寻找插入点的速度。
折半插入排序算法的具体操作为:
在将一个新元素插入已排好序的数组的过程中,寻找插入点时,将待插入区域的首元素设置为a[low],末元素设置为a[high],则轮比较时将待插入元素与a[m],其中m=(low+high)/2相比较,如果比参考元素小,则选择a[low]到a[m-1]为新的插入区域(即high=m-1),否则选择a[m+1]到a[high]为新的插入区域(即low=m+1),如此直至low<=high不成立,即将此位置之后所有元素后移一位,并将新元素插入a[high+1]。
[cpp] viewplaincopy
1.void binaryInsertSort(int *a,int size)
2.{
3. int low,high,m,temp,j;
4. for (int i=1;i5. temp=a[i];
6. low=0;
7. high=i-1;
8. /* if(a[i]>a[i-1]) //这句话可以稍微优化一下下速度 不影响结果
9. continue;*/
10. while (low<=high){
11. m=(low+high)/2;
12. if (temp<=a[m])
13. high=m-1; //当程序跳出时 high指向的其实并不是 >=temp的值的位置 而是>=temp的值的左边的位置 所以....
14. else
15. low=m+1;
16. }
17. for( j=i;j>high+1;--j) //所以 这里的high要加一哇
18. a[j]=a[j-1];
19. a[j]=temp;
20. }
21. print(a,size);
22.}
4,希尔排序
希尔算法思想:
将整个无序序列分割成若干小的子序列分别进行插入排序。
如一个长度为13的数组
81 94 11 96 12 35 17 95 28 58 41 75 15
先以13/2=5为gap进行比较即对(813541)(941775)(119515)分别进行排序 即对数组进行一次间距为5的插入排序
之后以3和1为间距对数组进行插入排序
[cpp] viewplaincopy
1.void shellSort(int *a,int size) // 代码取自 数据结构于问题求解(c++版)
2.{
3. for(int gap=size/2;gap>0;gap=gap==2?
1:
static_cast(gap/2.2)) // 这里计算出当前的 间距
4. {
5. for(int i=gap;i6. {
7. int temp=a[i];
8. int j;
9. for(j=i;j>=gap&&temp10. {
11. a[j]=a[j-gap];
12. }
13. a[j]=temp;
1