/*排序算法*/ #include<iostream> using namespace std; /*交换函数*/ void swap(int &a,int &b){ int temp=a; a=b; b=temp; } /*冒泡排序*/ void BubbleSort(int* a ,int length) { int i,j; for(i=0;i<length-1;++i) { for(j=length-1;j>i;--j) { if(a[j]<a[j-1]) { swap(a[j-1],a[j]); } } } } /*选择排序*/ void SelectSort(int *a,int length) { int i,j; int tmpindex; for(i=0;i<length-1;++i) { tmpindex=i; for(j=i+1;j<length;++j){ if(a[j]<a[tmpindex]){ tmpindex=j; } } if(tmpindex!=i) { swap(a[i],a[tmpindex]); } } } /*插入排序*/ void InsertSort(int* a,int length) { int i,j; for(i=1;i<length;++i) { int tmp=a[i]; for(j=i-1;j>=0;--j) { if(a[j]>tmp){ a[j+1]=a[j]; //后移 } else break; } a[j+1]=tmp; } } /*希尔排序,特殊方式的插入排序*/ void shellSort(int* a,int length) { int i,j; int d=length/2; //设置步长 do{ for(i=d;i<length;++i) { //内部是一个简单插入排序 int tmp=a[i]; for(j=i-d;j>=0;j-=d) { if(a[j]>tmp) { a[j+d]=a[j]; }else { break; } } a[j+d]=tmp; } d/=2; }while(d>0); } /*堆排序,主要是构建堆的过程*/ void AdjustMAXHeap(int* a,int pos,int length) { int temp,child; for(temp=a[pos];2*pos+1<=length;pos=child) { child=2*pos+1; if(child+1<=length&&a[child+1]>a[child]) //找左右孩子中最大的那一个 child++; if(a[child]>temp) a[pos]=a[child]; else break; } a[pos]=temp; } void MAXHeapSort(int* a,int length) { int i; for(i=length/2-1;i>=0;--i){ AdjustMAXHeap(a,i,length-1); } for(i=length-1;i>0;--i) { swap(a[0],a[i]); AdjustMAXHeap(a,0,i-1); } } /*归并排序*/ /*合并相邻位置的两段*/ void Merge(int* a,int p,int q,int r) { int i,j,k,n1,n2; n1=q-p+1; n2=r-q; int L[n1]; int R[n2]; for(i=0,k=p;i<n1;++i,++k) L[i]=a[k]; for(i=0,k=q+1;i<n2;++i,++k) R[i]=a[k]; for(k=p,i=0,j=0;i<n1&&j<n2;++k) { if(L[i]<R[j]) { a[k]=L[i]; ++i; } else { a[k]=R[j]; ++j; } } if(i<n1) { for(j=i;j<n1;++j,++k) a[k]=L[j]; } if(j<n2) { for(i=j;i<n2;++k,++i) { a[k]=R[i]; } } } void MergeSort(int* a,int p, int r) { if(p<r) { int q=(p+r)/2; MergeSort(a,p,q); MergeSort(a,q+1,r); Merge(a,p,q,r); } } /*快速排序,一分为二的思想*/ //找到对应的枢纽位置 int Partition(int* a,int low, int high) { int privotkey=a[low]; int tmp=low; while(low<high) { while(low<high&&a[high]>privotkey) --high; swap(a[tmp],a[high]); tmp=high; while(low<high&&a[low]<privotkey) ++low; swap(a[tmp],a[low]); tmp=low; } return tmp; } void quickSort(int* a,int low, int high) { if(low>=high) return; int index; index=Partition(a,low,high); quickSort(a,low,index-1); quickSort(a,index+1,high); } int main(){ int a[]={5,7,8,9,2,1,-3,6}; int n=sizeof(a)/sizeof(int); for(int i=0;i<n;++i){ cout<<a[i]<<" "; } cout<<endl; //BubbleSort(a,n); //SelectSort(a,n); //InsertSort(a,n); //shellSort(a,n); //MAXHeapSort(a,n); //MergeSort(a,0,n-1); quickSort(a,0,n-1); for(int i=0;i<n;++i){ cout<<a[i]<<" "; } cout<<endl; return 0; }