数据结构 - 排序
参考资料:
D. E. 克奴特 <计算机程序设计技巧>
排序算法分为两大类:
* 内部排序
* 外部排序
内部排序有
* 插入排序
* 交换排序
* 选择排序
* 归并排序
* 计数排序
1. 插入排序
void InsertSort(int a[], int n) { for(int i= 1; i<n; i++){ if(a[i] < a[i-1]){ //若第i个元素大于i-1元素,直接插入。小于的话,移动有序表后插入 int j= i-1; //表中最后一个数据 int x = a[i]; //复制为哨兵,即存储待排序元素 a[i] = a[i-1]; //先后移一个元素 (因为a[i]就是X,所以不怕丢失) while(j>=0 && x < a[j]){ //查找在有序表的插入位置 (遍历表) a[j+1] = a[j]; j--; //元素后移 } a[j+1] = x; //插入到正确位置 } } }
直接插入排序时间复杂度为O(n^2), 当n值很大时,不宜采用直接插入排序
2. 折半插入排序
void BInsertSort(int a[], int n) { for(int i= 1; i<n; i++){ int low=0, high=i; if(a[i] < a[i-1]){ //若第i个元素大于i-1元素,直接插入。小于的话,移动有序表后插入 int x = a[i]; //复制为哨兵,即存储待排序元素 a[i] = a[i-1]; //先后移一个元素 (因为a[i]就是X,所以不怕丢失) while(low<=high){ //查找在有序表的插入位置 (遍历表) int m=(low+high)/2; if(x<a[m]) high=m-1; else low=m+1; } for(int j=i-1;j>=high+1;j--) a[j+1]=a[j]; a[j+1] = x; //插入到正确位置 } } }
3.

浙公网安备 33010602011771号