#include<stdio.h> /* * 插入排序算法 每天一道算法题 */ void traverseArray(int *p,int length) { int i=0; for(;i<length;i++) { printf("%d\n",p[i]); } } //直接插入排序 void insertSorted(int *p,int length) { int i,j,temp; for(i=1;i<length;i++) { if(p[i]<p[i-1]) { temp=p[i]; p[i]=p[i-1]; for(j=i-2;j>-1&&temp<p[j];j--) p[j+1]=p[j]; p[j+1]=temp; } } } //折半插入排序 void BinsertSort(int *p,int length) { int i,j,temp,low,high,m; for(i=1;i<length;i++) { low=0; high=i-1; temp=p[i]; while(low<=high) { m=(low+high)/2; if(p[m]>temp) high=m-1; else low=m+1; } for(j=i-1;j>=high+1;j--) p[j+1]=p[j]; p[j+1]=temp; } } //希尔排序 void ShellSort(int *p,int length,int dk) { int i,j,temp; for(i=dk;i<length;i++) { if(p[i-dk]>p[i]) { temp=p[i]; for(j=i-dk;j>-1&&p[j]>temp;j-=dk) p[j+dk]=p[j]; p[j+dk]=temp; } } } int main() { int a[]={3,2,1,4,5,7,9,8,6}; // insertSorted(a,sizeof(a)/sizeof(int)); // BinsertSort(a,sizeof(a)/sizeof(int)); int i=4; for(;i>0;i--) { ShellSort(a,sizeof(a)/sizeof(int),i); traverseArray(a,sizeof(a)/sizeof(int)); printf("\n"); } traverseArray(a,sizeof(a)/sizeof(int)); system("pause"); }
直接插入排序算法逆序比较的次数(n-2)(n+1)/2,需要移动的次数为(n+4)(n-1)/2,如果是正序的话,需要比较的次数为n-1,此时不需要移动,平均算法比较和移动的次数为n2/4,算法的时间复杂度为O(n2)。
折半插入排序算法移动的次数和直接插入排序是相同的,比较的次数比直接插入排序减少,因此算法的时间复杂度为O(n2)。
希尔排序的思想每次先把组内的顺序排好,然后再修改组的大小,直到为1为止。希尔排序最好的的时间复杂度为n1.3。
插入类排序思想编程在于,每一次进行排序时,前面已经排序有序的,因此只要从后面往前面依次比较即可,需要注意内层循环的边界值,应该可以取到0值,否则第一个值就无法与后面的值进行比较。
插入类排序适用于基本有序的序列,其为稳定类排序。
时间: 2024-09-28 19:00:18