常考的排序算法汇总1:冒泡、快排(内含C源程序)

【常考的排序算法汇总1:冒泡、快排(C源程序)】

交换排序

1.冒泡排序

冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行的,直到没有再需要交换则结束,也就是说该数列已经排序完成。
1.1算法描述
[1].比较相邻的元素。如果第一个比第二个大,就交换它们两个;
[2].对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
[3].针对所有的元素重复以上的步骤,除了最后一个;
[4].重复步骤1~3,直到排序完成。
1.2举例理解

1.比较第1,2个数,若第一个数大于第二个数则交换位置,一直到最后一个数比较完毕,则第一轮结束

8 2 5 1 9 ——> 2 8 5 1 9 第一轮结果:2 5 1 8 9

2.接着从第一个数开始往后比,按第一个步骤的思想比较即可,最终结果为

1 2 5 8 9

1.3代码实现

#include <stdio.h> 
#define N 5
int main()
{
	int chuan[N];
	int i,j,temp;
	printf("请输入数字:\n");
	for(i=0;i<N;i++)
	{
		scanf("%d",&chuan[i]);
	}
	printf("\n");
	for(i=0;i<N-1;i++)
	{
		for(j=0;j<N-1-i;j++)
		{
			if(chuan[j]>chuan[j+1])
			{
			temp=chuan[j+1];
			chuan[j+1]=chuan[j];
			chuan[j]=temp;
			}
		}
	}
	for(i=0;i<N;i++)
	{
		printf("%d\n",chuan[i]);
	}
	return 0;
}
	

2.快速排序

快速排序是通过一趟排序将待排记录分隔成独立的两部分,一般来说按从小到大排序,其中右边部分记录的关键字均比左边部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

2.1算法描述 2.2举例理解

30 40 50 10 70 (此例起始 left 指向30, right 指向70;30为 base

第一步:首先我们从数组的起始位置取出该数作为基准参照物,下例的30;

30 40 50 10 70

第二步:从数组的(right)向前找,一直找到比(base)小的数,如果找到则将(base)赋给(left)位置(也就是将10赋给30);

10 40 50 10 70

第三步:从数组的(left)位置向后找,一直找到比(base)大的数,
如果找到,将此数赋给(right)的位置(也就是40赋给10);

10,40,50,40,70

第四步:重复“第二,第三“步骤,直到left和right指针重合,
最后将(base)插入到40的位置,即完成一次排序;

10,20,50,40,60

第五步:此时20已经潜入到数组的内部,20的左侧一组数都比20小,20的右侧作为一组数都比20大,以20为切入点对左右两边数按照1~4步骤进行,最终快排大功告成。

2.3代码实现

#include <stdio.h>
#define N 6
void Quicksort(int s[],int g,int k)
{
	int i,j,x;
	if(g<k)
	{
		i=g;
		j=k;
		x=s[i];
		while(i<j)
		{
			while(i<j&&s[j]>=x)
			j--;
			if(i<j)
			s[i++]=s[j];
			while(i<j&&s[i]<=x)
			i++;
			if(i<j)
			s[j--]=s[i];
		}
		s[i]=x;
		Quicksort(s,g,i-1);
		Quicksort(s,i+1,k);
	}
}
int main()
{
	int i,a[N];
	printf("请输入一串数字:\n");
	for(i=0;i<N;i++)
	{
		scanf("%d",&a[i]);
	}
	Quicksort(a,0,N-1);
	for(i=0;i<=N;i++)
	{	
		printf("%4d\n",a[i]);
	}
	return 0;
}

(有错误麻烦指正,多多关照,做小白的第一天)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值