关于排序的两种算法,快速排序和希尔排序。
快速排序:快速排序有种分治的思想,即先选定一个基准,然后以此基准将整个序列分为两个子序列,小于基准的都放到前面,大于基准的都放到后面。
然后递归处理两个子序列,直到子序列长为1;算法时间复杂度为O(n*logn)。
希尔排序:希尔排序则比较巧妙,其思想为逐渐缩小步长的过程中进行冒泡排序(也可进行直接插入排序)。其中步长的变化有很多种方法,我代码中是用的不断除2的方法,有牛人提出d[k] = 2^(t - k + 1) - 1,(1 <= t <= log2(n+1)),的增量序列。希尔排序也是一种不稳定的算法(在排序过程中数值相等的数据可能会改变位置)
#include<iostream> #include<cstdio> #include<cmath> using namespace std; #define Maxn 1024 void Fastsort(int a[],int low,int high) { if(low>high) return; int i=low;int j=high; int tmp=a[i]; while(i<j) { while(a[j]>=tmp&&j>i) j--; a[i]=a[j]; while(a[i]<=tmp&&j>i) i++; a[j]=a[i]; } a[i]=tmp; Fastsort(a,low+1,i); Fastsort(a,i+1,high); } int main() { int a[Maxn]; int n; printf("请输入要排序数据的个数\n"); scanf("%d",&n); printf("请输入每个数据的大小\n"); for(int i=1;i<=n;i++) scanf("%d",&a[i]); Fastsort(a,1,n); for(int i=1;i<=n;i++) printf("%d ",a[i]); return 0; }
#include<iostream> #include<cstdio> #include<cmath> using namespace std; #define Maxn 1024 //希尔排序 步长缩短的过程中进行冒泡排序 void Hashsort(int a[],int n,int dt) { if(dt<1) return; for(int i=1;i<=n;i+=dt) { int tmp; for(int j=1+dt;j<=n;j+=dt) { if(a[j]<a[j-dt]) { tmp=a[j]; a[j]=a[j-dt]; a[j-dt]=tmp; } } } Hashsort(a,n,dt/2); } int main() { int a[Maxn]; int n; printf("请输入要排序数据的个数\n"); scanf("%d",&n); printf("请输入每个数据的大小\n"); for(int i=1;i<=n;i++) scanf("%d",&a[i]); Hashsort(a,n,n/4); for(int i=1;i<=n;i++) printf("%d ",a[i]); return 0; }