1、冒泡排序:每次将最大或最小值通过交换放到数组前面。
void Bubble_Sort() //冒泡排序 { int i,j,tmp,pos; for(i=0;i<n;i++) for(j=0;j<n-i-1;j++) if(a[j]>a[j+1]){ tmp=a[j]; a[j]=a[j+1]; a[j+1]=tmp; } }
2、插入排序:
由n-1趟排序组成,对于从P=1到P=n-1趟排序,每次排序保证从0到P之间的元素为已排序状态(即0~P-1是排好序的)。
void Insert_Sort() //插入排序 { int i,j,tmp; for(i=1;i<n;i++){ tmp=a[i]; for(j=i;j>0&&a[j-1]>tmp;j--) a[j]=a[j-1]; a[j]=tmp; } }
3、希尔排序:
通过比较相距一定间隔的元素来工作,这些间距序列h1,h2,……,hn又称为增量序列,相当于对这些增量序。
相当于对独立的hi个独立的子数组进行插入排序。
void Shell_Sort() //希尔排序 { int i,j,k,tmp; for(i=n/2;i>0;i/=2){ for(j=i;j<n;j++){ tmp=a[j]; for(k=j;k>=i;k-=i) if(tmp<a[k-i]) a[k]=a[k-i]; else break; a[k]=tmp; } } }
4、堆排序
思路:
将n个元素建一个对根节点最大的最大堆,
然后每次DeleteMax,并将这个值放到数组末尾,最后形成一个从小到大排列的数组。
void Swap(int &x,int &y) { int tmp=x;x=y;y=tmp; } void PercDown(int i,int len) { int tmp=a[i],child; for(;i*2<len;i=child){ child=i*2; if(child!=len-1&&a[child+1]>a[child]) child++; if(tmp<a[child]) a[i]=a[child]; else break; } a[i]=tmp; } void Heap_Sort(int len) { int i,j; for(i=len/2;i>=0;i--) PercDown(i,len); for(i=len-1;i>=0;i--){ Swap(a[0],a[i]); PercDown(0,i); } }
5、归并排序
基本操作:合并两个有序表,先将一个数组不断划分为不同阶段的数组,然后依次合并这些数组。
int b[1200]; void Merge(int left,int mid,int right) { int i=left,j=mid+1,pos=left; while(i<=mid&&j<=right){ if(a[i]<a[j]) b[pos++]=a[i++]; else b[pos++]=a[j++]; } while(i<=mid) b[pos++]=a[i++]; while(j<=right) b[pos++]=a[j++]; for(i=left;i<=right;i++) a[i]=b[i]; } void Merge_Sort(int left,int right) { if(left<right){ int mid=(left+right)/2; Merge_Sort(left,mid); Merge_Sort(mid+1,right); Merge(left,mid,right); } }
6、快速排序:
思路:先找到一个枢纽元,然后将大于枢纽元的元素放到右边,小于枢纽元的元素放到左边,
依次递归下去,直到所有元素都有序。
void Quick_Sort(int left,int right) { if(left>=right) return ; int i=left,j=right-1,tmp=a[left]; while(i!=j){ while(i<j&&a[j]>=tmp) j--; if(i<j) a[i]=a[j]; while(i<j&&a[i]<=tmp) i++; if(i<j) a[j]=a[i]; } a[i]=tmp; Quick_Sort(left,i-1); Quick_Sort(i+1,right); }