快速排序--C语言

快速排序是冒泡排序的改进版,也是最好的一种内排序,在很多面试题中都会出现,也是作为程序员必须掌握的一种排序方法。

思想:

1、在待排序的元素任取一个元素作为基准(通常选第一个元素,但最好的选择方法是从待排序元素中随机选取一个作为基准),称为基准元素;

2、将待排序的元素进行分区,比基准元素大的元素放在它的右边,比其小的放在它的左边;

3、对左右两个分区重复以上步骤直到所有元素都是有序的;

4、不断地进行递归下去,好像二分法一样(二分法后,然后对每一边再进行二分法)。


所以我是把快速排序联想成东拆西补或西拆东补,一边拆一边补,直到所有元素达到有序状态。


下面再看看如图理解下吧:


然后对元素5两边的元素也重复以上操作,直到元素达到有序状态。

代码如下:

#include <stdio.h>

void find_frst(int *s,int left,int right)
{
	int i=left,j=right,temp;
	if(left>=right)
		return;
	temp=s[i];	//以数组的第一个数为比较值,保存到temp中 ,基准元素 
	while(i<j)
	{
		while(j>i && s[j]>=temp)	//j--,把第一个比temp小的值放到左侧 
			j--;	//从右往左扫描 
		s[i]=s[j];
		
		while(i<j && s[i]<=temp)	//i++,把第一个比temp大的值放到右侧 
			i++;	//从左往右扫描 
		s[j--]=s[i];	//保存最大值到s[j] 
	}
	s[i]=temp;	//基准元素归位 
	
	find_frst(s,left,i-1);	//对基准元素左边的元素进行递归排序 
	find_frst(s,i+1,right);	//对基准元素右边的进行递归排序 
} 

int main(void)
{
	int i=0,s[100],n;
	scanf("%d",&n);
	for(i=0;i<n;i++)
		scanf("%d",&s[i]);
	find_frst(s,0,n-1);	//快速排序,升序 
	for(i=0;i<n;i++)
		printf("%d",s[i]);
	printf("\n");
}

输入:

5 7 1 8 4 

打印:
1 4 5 7 8

猜你喜欢

转载自blog.csdn.net/xiaodingqq/article/details/80739069