#include<iostream>usingnamespace std;constint N =100010;int n;int q[N];// 直接插入排序 voidinsert_sort(){for(int i =1; i < n; i ++){// 取出当前元素赋值给t,j从当前位置开始往前看 int t = q[i], j = i;while(j && q[j -1]> t){
q[j]= q[j -1];
j --;}
q[j]= t;// 把t放到正确的位置上}}intmain(){
cin >> n;for(int i =0; i < n; i ++) cin >> q[i];insert_sort();for(int i =0; i < n; i ++) cout << q[i]<<' ';return0;}
1.2 折半插入排序
voidbinsert_sort(){for(int i =1; i < n; i ++){if(q[i -1]<= q[i])continue;int t = q[i];// 二分出第一个大于t的位置int l =0, r = i -1;while(l < r){int mid = l + r >>1;if(q[mid]> t) r = mid;else l = mid +1;}// 从r开始到i - 1的位置的数往后移动一位 for(int j = i -1; j >= r; j --)
q[j +1]= q[j];
q[r]= t;// 把t放到正确的位置上}}
1.3 希尔排序
voidshell_sort(){// 枚举增量 for(int d = n /3; d; d = d ==2?1: d /3){// 枚举起点 for(int start =0; start < d; start ++){// 做插入排序 for(int i = start + d; i < n; i += d){int t = q[i], j = i;while(j > start && q[j - d]> t){
q[j]= q[j - d];
j -= d;}
q[j]= t;}}}}
2 交换排序
2.1 冒泡排序
voidbubble_sort(){// 迭代n - 1次for(int i =0; i < n -1; i ++){bool has_sawp =false;// 优化 for(int j = n -1; j > i; j --)if(q[j]< q[j -1]){swap(q[j], q[j -1]);
has_sawp =true;}if(!has_sawp)break;}}
2.2 快速排序
voidquick_sort(int l,int r){if(l >= r)return;int i = l -1, j = r +1, x = q[(l + r)>>1];while(i < j){do i ++;while(q[i]< x);do j --;while(q[j]> x);if(i < j)swap(q[i], q[j]);}quick_sort(l, j);quick_sort(j +1, r);}
3 选择排序
3.1 简单选择排序
voidselect_sort(){// 迭代n - 1次for(int i =0; i < n -1; i ++){int k = i;for(int j = i +1; j < n; j ++)if(q[j]< q[k])
k = j;swap(q[i], q[k]);}}
3.2 堆排序
#include<iostream>usingnamespace std;constint N =100010;int n;int h[N], sz;// 调整为大根堆voiddown(int u){int tmax = u;if(u *2<= sz && h[u *2]> h[tmax]) tmax = u *2;if(u *2+1<= sz && h[u *2+1]> h[tmax]) tmax = u *2+1;if(u != tmax){swap(h[u], h[tmax]);down(tmax);}}voidheap_sort(){
sz = n;for(int i = n /2; i; i --)down(i);for(int i =0; i < n -1; i ++){swap(h[1], h[sz]);
sz --;down(1);}}intmain(){
cin >> n;for(int i =1; i <= n; i ++) cin >> h[i];heap_sort();for(int i =1; i <= n; i ++) cout << h[i]<<' ';return0;}
4 归并排序
#include<iostream>#include<algorithm>usingnamespace std;constint N =100010;int n;int a[N], tmp[N];voidmerge_sort(int l,int r){if(l == r)return;int mid = l + r >>1;merge_sort(l, mid),merge_sort(mid +1, r);int i = l, j = mid +1;int k =0;while(i <= mid && j <= r){if(a[i]<= a[j]) tmp[k ++]= a[i ++];else tmp[k ++]= a[j ++];}while(i <= mid) tmp[k ++]= a[i ++];while(j <= r) tmp[k ++]= a[j ++];for(int i = l, j =0; i <= r; i ++, j ++) a[i]= tmp[j];}intmain(){scanf("%d",&n);for(int i =0; i < n; i ++)scanf("%d",&a[i]);merge_sort(0, n -1);for(int i =0; i < n; i ++)printf("%d ", a[i]);return0;}