/* 1.插入排序 2.选择排序 3.冒泡排序 4.希尔排序 5.快速排序 6.归并排序 7.堆排序 */ /* 1.插入排序 思路:R[0],R[1],...R[i]是已经排序好的序列,要把R[i+1]插入到合适的位置。 template <typename T > */ void insertionSort(vector<T> &a) { int j; T temp; for(int i=1;i<a.size();i++) { temp=a[i]; j=i-1; while(temp<a[j]) { a[j+1]=a[j]; j--; } a[j+1]=temp; } } /* 2.选择排序: 依次遍历,在合适的位置选择合适的数。每次选择最小的那一个。 */ template <typename T> void selectionSort(vector<T> &a) { int num=a.size(); T temp; int p; for(int i=0;i<num;i++) { temp=a[i]; p=i; for(int j=i+1;j<num;j++) { if(a[j] < a[i]) p=j; } if(p != i) { temp=a[p]; a[i]=a[p]; a[p]=temp; } } } /* 3.冒泡排序 思路:从上到下,挨个比较相邻的两个数,较大的放在下面,知道任何两个数都是小在上,大在下。 */ template<typename T> void bubbleSort(vector<T> &a) { int num=a.size(); T temp; bool flag=false; for(int i=0;i<num-1;i++) { flag=false; for(int j=0;j<num-i;j++) { if(a[j] > a[j+1]) { flag=true; temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } if(flag==false) break; } } /* 4.希尔排序 思路:不是再每次比较相邻的两个数,而是比较间隔固定距离的两个数,这样一次可以减少。 */ template<typename T> void shellSort(vector<T> &a, int *incre, int ni) //增量存在数组incre里面,ni是数组incre的长度 { int j; T temp; for(int g=0;gi<ni;g++) { for(int i=incre[g];i<a.size();i++) { temp=a[i]; j=i-incre[g]; while(temp<a[j]) { a[j+incre[g]]=a[j]; j--; } a[j+incre[g]]=temp; } } } template<typename T> void shellSort2(vector<T> &a) { int num=a.size(); int i,j,j; T temp; ( (n/2)%2 ==0)? k=n/2+1 : k=n/2;//保证k为奇数 while(k>0) { for(i=k;i<num;i++) { temp=a[i]; j=i-k; while( temp < a[j]) { a[j+k]=a[j]; j-=k; } a[j+k]=temp; } (k/2)%2==0 ? k=k/2+1 : k=k/2; } } /* 5.快速排序 思路:选定一个值(可随机,可为a[0],随机更好),将小于这个数的所有数放在它的左边,大于这个数的放在又变。 */ template<typename T> void quickSort(vector<T> &a, int l, int r) { if(l<r) { int q=partition(a,l,r); quickSort(a,l,q-1); quickSort(q,q+1,r); } } template<typename T> void partition(vector<T> &a, int l, int r) { T temp=a[l],t; int i=l,j=r; while(i<=j) { while( a[++i]<temp && i<r); while( a[j--]>temp); t=a[i]; a[i]=a[j]; a[j]=t; } a[l]=a[j]; a[j]=x; return j; } /* 6.归并排序 思路:将数组分段,分治思想,然后再合并 */ template<typename T> void mergeSort(vector<T> &a) { vector<T> tmpArray(a.size()); mergeSort(a, tmpArray, 0, a.size()-1); } template<typename T> void mergeSort(vector<T> &a, vector<T> &tmpArray,int l, int r) { if(l<r) { int center=(l+r)/2; mergeSort(a, tmpArray, l, center); mergeSort(a, tmpArray, center+1, r); merge(a,tmpArray,l,center+1,r); } } template<typename T> void merge(vector<T> &a, vector<T> &tmpArray,int l, int center, int r) { int i=l,j=center; int k=l; while(i<center && j<=r) { if(a[i] < a[j] ) tmpArray[k++]=a[i++]; else tmpArray[k++]=a[j++]; } while(i < center) tmpArray[k++]=a[i++]; while(j <= r) tmpArray[k++]=a[j++]; for(i=l;i<=r;i++) { a[i]=tmpArray[i]; } } /* 7.堆排序 思路:建立堆,堆顶为最大。交换堆顶与堆底。调节二叉树,使堆顶元素始终为最大元素 */ template<typename T> void heapSort(vector<T> &a) { for (int i=a.size()/2;i>=0;--i)//build heap { perdown(a, i, a.size()); } T temp; for(int j=a.size()-1;j>=0;--j) { temp=a[j]; a[j]=a[0]; a[0]=temp; perdown(a, 0 ,j); } } template<typename T> void perdown(vector<T>&a, int i, int n) { int child; T temp; for(temp=a[i]; 2*i+1<n;i=child) { child=2*i+1; if(child+1<n && a[child]<a[child+1]) ++child; if(temp <a[child]) a[i]=a[child]; else break; } a[i]=temp; } int main() { vector<int> vi(5); vi[0]=3; vi[1]=2; vi[2]=1; vi[3]=5; vi[4]=4; cout<<"heapSort"<<endl; heapSort(vi); for (int i=0;i<vi.size();i++) { cout<<vi[i]<<" "; } cout<<endl; cout<<"mergeSort"<<endl; mergeSort(vi); for (int i=0;i<vi.size();i++) { cout<<vi[i]<<" "; } cout<<endl; getchar(); return 1; }