排序

数据结构里学了好多排序的算法,现在来整理一下吧

收集了几个排序算法的舞蹈一起感受程序员的艺术吧

插入排序: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;
}


排序_第1张图片

你可能感兴趣的:(数据结构,c,算法,merge)