1.快速排序 #include <iostream> using namespace std; void qsort(int a[],int i,int j); //快速排序 void main() { int a[]={49,38,65,97,76,13,27}; qsort(a,0,6); for (int i=0;i<=6;i++) { cout<<a[i]<<" "; } cout<<endl; } int part(int a[],int i,int j) { int key=a[i]; while(i<j) { while(i<j&&a[j]>=key) j--; a[i]=a[j]; while (i<j&&a[i]<key) i++; a[j]=a[i]; } a[i]=key; return i; } void qsort(int a[],int i,int j) { int loc = part(a,i,j); if (loc==i||loc==j) { return; } qsort(a,0,loc-1); qsort(a,loc+1,j); } 2.堆排序 堆排序的思想,利用完全二叉树的形式,孩子结点比父结点大,从n/2~0筛选一次。 #include <iostream> using namespace std; void heapsort(int a[],int n); void main() { int a[]={49,38,65,97,76,13,27}; //堆排序 heapsort(a,6); for (int i=0;i<=6;i++) { cout<<a[i]<<" "; } cout<<endl; } void sift(int a[],int i,int n) { int child,temp; for (temp=a[i];2*i<n;i=child) { child = 2*i; if ((child!=n) && (a[child]<a[child+1])) { child++;//取子节点较大的 } if (temp<a[child]) { a[i]=a[child];//交换 } else break; } a[i]=temp; } void heapsort(int a[],int n) { int temp; //1.建堆 for (int i=n/2;i>=1;i--) { sift(a,i,n); } //2.调整堆 for (i=n;i>=2;i--) { //交换堆顶和第一个 temp=a[1]; a[1]=a[i]; a[i]=temp; sift(a,1,i-1); } } 3.shell排序 递归增量排序,实际上是插入排序的修改,将插入排序的递增变量1修改为d即可。 void shellsort(int a[],int n) { int i,j,d; d= n / 2; while (d > 0) { //以d为间隔的插入排序 for ( i = d; i < n; i++ ) { int temp = a[i]; for (j=i-d;j>=0&&a[j]>temp;j-=d) a[j + d] = a[j]; a[j + d] = temp; } d = d/2; } } 4.插入排序 void insertsort(int a[],int n) { for (int i=0;i<n;i++) { int temp = a[i]; for (int j=i-1;j>=0 && a[j]>temp;j--) { a[j+1]=a[j]; } a[j+1]=temp;//因为j最后减1,所以为a[j+1] } }