// !!!特殊:堆排序中数组a下标从1开始// 假设数组a为全局变量,不然没办法运行…voiddown(int u,int cnt)// 结点不断下坠{int t = u;if(2* u <= cnt && a[2* u]> a[t]) t =2* u;if(2* u +1<= cnt && a[2* u +1]> a[t]) t =2* u +1;if(t != u){swap(a[t], a[u]);down(t, cnt);}}voidheap_sort(int a[],int n){// 大根堆:从小到大,得到的是升序序列;// 小根堆:小大到小,得到的是降序序列;// 建立大根堆的过程for(int i = n /2; i >=1; i --)down(i, n);// 堆排序的过程int cnt = n;// cnt记录需要排序的二叉树中的结点个数for(int i = n; i >1; i --){// 我真吐了,调试半天,没发现是a[i]写成了别的swap(a[i], a[1]);
cnt --;down(1, cnt);}}
4. 直接插入排序
voidinsert_sort(int a[],int n){for(int i =1; i < n; i ++){int x = a[i];// 待插入元素,相当于“哨兵”int j;for(j = i -1; j >=0; j --){if(a[j]> x) a[j +1]= a[j];elsebreak;}
a[j +1]= x;}}
5. 折半插入排序
voidbinary_insert(int a[],int n){for(int i =1; i < n; i ++){int x = a[i];// 待插入元素// l指向从左往右第一个大于x的元素,即插入位置int l =0, r = i -1;while(l <= r){int mid = l + r >>1;if(a[mid]> x) r = mid -1;else l = mid +1;}for(int j = i -1; j >= l; j --)
a[j +1]= a[j];
a[l]= x;}}
6. 简单选择排序
voidselect_sort(int a[],int n){for(int i =0; i < n; i++){for(int j = i +1; j < n; j++)if(a[j]< a[i])swap(a[i], a[j]);}}