C语言:快速排序(详解)

快速排序采用的是两头对比交换

http://t.csdn.cn/TXcAK

上面这个连接大家可以点进去看看博客李小白大大的图文解释,我觉得这个是对我启发比较大的,对刚接触快速排序的人来说非常友好,很快就可以了解到其中的原理。

然后我的代码稍微和里博客李小白的稍稍有点不一样;

我在敲代码过程中发现快速排序对条件限制非常严格,我认为如果你对在从左到右扫描的时候,和从右到左扫描的时候那个限制条件理解了,说明你对这个快速排序的的代码才算真正会敲了,而不是只会原理这么简单。

①首先第一个比较乱的点是我这个代码再从左到右扫描的时候,while条件限制是没有取等号的,且在我这个代码里面是不能取等号,我里面有注释,是因为不能让左边往右走的时候超过基准这个位置,同理右边也是,不能超过基准mid,所以在左右两边退出各自的小while循环的时候都不会超过基准这个位置,而出去之后,遇到if了交换各自的数值,继续对左右都进行各自继续相向走一步。

②往复之后,最终他们会相遇到mid这个位置,遇到if之后继续相向各走一步,那么有了这个操作之后就不符合大循环while这个条件,退出大循环了。

③退出大循环后,你会发现咱的数组被基准分成了两半,这两半分别进行刚刚那个步骤就可以实现快速排序。

④两边各自进入函数运行到函数最后又会被分成两份,这两份中又各自进入函数,又会继续分,这就是为什么有人说快速排序是二分法。

⑤最后当没得分了,也就是代码中left>right的时候,就会return回来,结束整个函数运行,排序完成。

#include<stdio.h>

void quick_pai(int *, int star, int end);//快速排序 

void swap(int *left, int *right);//交换两个数字 

int main()
{
	/*
	
	
	*/
	int i, j;
	int arr[10] = {6,1,2,7,9,3,4,5,10,8}; 
	quick_pai(arr, 0, 9);
	for(i = 0; i < 10; i++)
	{
		printf("%d\t", arr[i]);
	}
	return 0;
}

void quick_pai(int *arr, int star, int end)
{
	int mid;//基准
	int left = star;
	int right = end;
	mid = arr[(left+right)/2];
	if(left > right)
	{
		return;
	}
	else
	{
		while(left <= right)
		{
			while(arr[left] > mid)//不能取等于号,因为这样会使这个数字在遇到mid的时候不会退出,而是再次移动一格才退出 ,不能使他超过mid的这个位置 
		{
			left++;
		}
		while(arr[right] < mid)//同理不能取等号,用来限制在位移到mid这个的时候不再移动了 
		{
			right--;//4 5 8 9 6 3 5 8 5 8
		}
		
		if(left <= right)
		//与上面对应的是 这个条件不会使 , 因为上面说了,两个最后都会位移到mid这个位置上,所以左边下标要么小于右边,要么等于,所以这个可以取等号 
		{
			swap(&arr[left], &arr[right]);//如果左边下标小于右边下标则交换 
			left++;
			right--;
		}
		 
		}
	}
	
	if(star < right) quick_pai(arr, star, right);//因为刚刚right--了,往左又移动了一步,所以这个right其实已经小于left了,所以在左边用right 
	/*对左边排序, 不取等号的原因是在return那里的条件没有取等号,
	所以在等于的时候不会返回,所以在传进去的时候就不能取等号,
	就不会导致在应该结束的时候不会return回来 
	*/ 
	
	if(left < end) quick_pai(arr, left, end);//同理因为 left已经大于right了,所以在右边用left
	//对右边排序 
	
	
}

void swap(int *left, int *right)
{
	int t;
	t = *left;
	*left = *right;
	*right = t;
 } 

posted @ 2022-03-31 16:50  竹等寒  阅读(5)  评论(0编辑  收藏  举报  来源