你不可不知道的几种常用排序

1、冒泡排序

#include <stdio.h>

int main()
{
	int i,j;
	int itemp;
	int a[10] = {1,3,2,5,6,4,8,9,7,10};

	//从小到大排序
	for(i = 1; i<10; i++)
	{
		for(j=9; j>=i; j--)
		{
			if(a[j]<a[j-1])
			{
				//交换相临的两个元素的位置
				itemp = a[j-1];
				a[j-1] = a[j];
				a[j] = itemp;
			}
		}
	}

	//输出数组
	for(i=0; i<10; i++)
	{
		printf("a[%d]=%d\t",i,a[i]);
		if((i+1) % 5 == 0)
			printf ("\n");
	}
	
}

2、选择排序

#include <stdio.h>

int main()
{
	int i,j;
	int itemp,pos;
	int a[10] = {1,3,2,5,6,4,8,9,7,10};

	//从小到大排序
	for(i=0; i<9; i++)
	{
		itemp = a[i];
		pos = i;
		for(j=i+1; j<10; j++)
		{
			if(a[j]<itemp)
			{
				itemp = a[j];
				pos = j;
			}
		}
		//交换两个元素值
		a[pos] = a[i];
		a[i] = itemp;
	}

	//输出数组
	for(i=0; i<10; i++)
	{
		printf("a[%d]=%d\t",i,a[i]);
		if((i+1) % 5 == 0)
			printf ("\n");
	}
	
}

3、直接插入排序

#include <stdio.h>

int main()
{
	int i;
	int itemp,pos;
	int a[10] = {1,3,2,5,6,4,8,9,7,10};

	//从小到大排序
	for(i=1; i<10; i++)
	{
		itemp = a[i];
		pos = i-1;
		while((pos>=0) && (itemp < a[pos]))
		{
			a[pos+1] = a[pos];
			pos--;
		}
		a[pos+1] = itemp;
	}

	//输出数组
	for(i=0; i<10; i++)
	{
		printf("a[%d]=%d\t",i,a[i]);
		if((i+1) % 5 == 0)
			printf ("\n");
	}
	
}

5、交换排序

#include <stdio.h>

int main()
{
	int i,j;
	int itemp;
	int a[10] = {1,3,2,5,6,4,8,9,7,10};

	//从小到大排序
	for(i=0; i<9; i++)
	{
		for(j=i+1; j<10; j++)
		{
			if(a[j] < a[i])
			{
				//交换两个数值
				itemp = a[i];
				a[i] = a[j];
				a[j] = itemp;
			}
		}
	}

	//输出数组
	for(i=0; i<10; i++)
	{
		printf("a[%d]=%d\t",i,a[i]);
		if((i+1) % 5 == 0)
			printf ("\n");
	}
	
}

6、快速排序法(折半排序法)

#include <stdio.h>

void CelerityRun(int left, int right, int arr[])
{
	int i,j;
	int middle,itemp;
	i = left;
	j = right;
	middle = arr[(left+right)/2];
	do
	{
		while((arr[i]<middle) && (i<right))			//从左侧找小于中值的数
			i++;
		while((arr[j]>middle) && (j>left))			//从右侧找大于中值的数
			j--;
		
		if(i<=j)						//找到一对值
		{
			itemp = arr[i];
			arr[i] = arr[j];
			arr[j] = itemp;
			i++;
			j--;
		}
	}while(i<=j);			//如果两边的下标交错,就停止(完成一次)
		
	if(left < j)			//递归左半边
		CelerityRun(left,j,arr);
	if( right > i )
		CelerityRun(i, right, arr);

}

int main()
{
	int i;
	int a[10] = {1,3,2,5,6,4,8,9,7,10};

	//从小到大排序
	CelerityRun(0,9,a);

	//输出数组
	for(i=0; i<10; i++)
	{
		printf("a[%d]=%d\t",i,a[i]);
		if((i+1) % 5 == 0)
			printf ("\n");
	}
	
}

7、希尔排序

#include <stdio.h>

void shsor(int s[], int n)
{
	int i, j, d;
	d = n/2;

	while(d>=1)
	{
		for(i=d+1; i<=n; i++)
		{
			s[0] = s[i];
			j = i-d;
			while(( j>0 ) && ( s[0]<s[j] ))
			{
				s[j+d] = s[j];
				j = j-d;
			}
			s[j+d] = s[0];
		}
		d = d/2;
	}
}

int main()
{
	int i;
	int a[11] = {0,1,3,2,5,6,4,8,9,7,10};

	//从小到大排序
	shsor(a,10);

	//输出数组
	for(i=1; i<=10; i++)
	{
		printf("a[%d]=%d\t",i,a[i]);
		if(i % 5 == 0)
			printf ("\n");
	}
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值