数据结构里学了好多排序的算法,现在来整理一下吧
收集了几个排序算法的舞蹈,一起感受程序员的艺术吧
插入排序:http://rrurl.cn/jgVFb1
希尔排序:http://rrurl.cn/bk5ivP
快速排序:http://rrurl.cn/sPoa91
归并排序:http://rrurl.cn/bDwSo7
下面贴几个简易的代码吧
直接插入排序
#include<stdio.h> #include<string.h> int main() { int i,j,n; int a[1000]; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) scanf("%d",&a[i]); for(i=2;i<=n;i++) { if(a[i]<a[i-1]) { a[0]=a[i]; a[i]=a[i-1]; for(j=i-2;a[0]<a[j]?1:0;j--) a[j+1]=a[j]; //记录后移 a[j+1]=a[0]; } } for(i=1;i<=n;i++) printf(i==n?"%d\n":"%d ",a[i]); } return 0; }
希尔排序,也称缩小增量的排序
#include<stdio.h> #include<string.h> int dlta[4]={8,4,2,1}; int n; void shellsort(int a[],int dk) { int i,j; for(i=dk+1;i<=n;i++) { if(a[i]<a[i-dk]) { a[0]=a[i]; for(j=i-dk;j>0&&a[0]<a[j]?1:0;j-=dk) a[j+dk]=a[j]; a[j+dk]=a[0]; } } } int main() { int i; int a[1000]; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) scanf("%d",&a[i]); for(i=0;i<4;i++) shellsort(a,dlta[i]); for(i=1;i<=n;i++) printf(i==n?"%d\n":"%d ",a[i]); } return 0; }
快速排序
#include<stdio.h> #include<string.h> int n; int partition(int a[],int low,int high) { int pivotkey; a[0]=a[low]; pivotkey=a[low]; while(low<high) { while(low<high&&a[high]>=pivotkey) high--; a[low]=a[high]; while(low<high&&a[low]<=pivotkey) low++; a[high]=a[low]; } a[low]=a[0]; return low; } void qsort(int a[],int low,int high) { int pivotloc; if(low<high) { pivotloc=partition(a,low,high); qsort(a,low,pivotloc-1); qsort(a,pivotloc+1,high); } } int main() { int i; int a[1000]; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) scanf("%d",&a[i]); qsort(a,1,n); for(i=1;i<=n;i++) printf(i==n?"%d\n":"%d ",a[i]); } return 0; }
堆排序
#include<stdio.h> #include<string.h> int n; void heapsort(int a[],int s,int m) //数组中除了a[s]均满足堆的定义,本函数调整a[s],使其仍为一个大顶堆 { int j,rc; rc=a[s]; for(j=2*s;j<=m;j*=2) { if(j<m&&a[j]<a[j+1]) j++; if(!(rc<a[j])) break; a[s]=a[j]; s=j; } a[s]=rc; } int main() { int i,temp; int a[1000]; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) scanf("%d",&a[i]); for(i=n/2;i>=1;i--) heapsort(a,i,n); for(i=n;i>1;i--) { temp=a[i]; a[i]=a[1]; a[1]=temp; heapsort(a,1,i-1); } for(i=1;i<=n;i++) printf(i==n?"%d\n":"%d ",a[i]); } return 0; }
归并排序
#include<stdio.h> #include<string.h> int n; void merge(int c[],int l,int m,int r) { int i,j,k; int d[1000]; i=l; j=m+1; k=1; while(i<=m&&j<=r) { if(c[i]<=c[j]) d[k++]=c[i++]; else d[k++]=c[j++]; } while(i<=m) d[k++]=c[i++]; while(j<=r) d[k++]=c[j++]; for(i=l,k=1;i<=r;i++,k++) c[i]=d[k]; } void mergesort(int c[],int left,int right) { int mid; if(left<right) //至少有两个元素 { mid=(left+right)/2; mergesort(c,left,mid); mergesort(c,mid+1,right); merge(c,left,mid,right); } } int main() { int i; int a[1000]; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) scanf("%d",&a[i]); mergesort(a,1,n); for(i=1;i<=n;i++) printf(i==n?"%d\n":"%d ",a[i]); } return 0; }