数据结构里学了好多排序的算法,现在来整理一下吧
收集了几个排序算法的舞蹈,一起感受程序员的艺术吧
下面贴几个简易的代码吧
直接插入排序
#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;
}
![](https://img-my.csdn.net/uploads/201206/23/1340426174_9619.jpg)