快速排序———挖坑填补法

快排的基本思路:

首先将数组的第一个数字作为标准值;然后我们只需要找到该数组在排好序后的数组中的位置,在此位置之前的数字都比该数字小,在此位置之后的数字都比还数字大。

下面介绍一下怎么找到标准值的位置:

1 先将标准值保存,腾出标准值的位置,出坑(注 坑不是实际意义上的空间,而是我们假象的,只需要保存标准时即可)

2 从后面向前找到比标准值小的数字,放在坑里,这样又腾出一个位置

3 再从前向后找到比标准值大的数字 放在坑里

循环找到标准值的位置,最后将数字分成两部分,标准值前的数字较小,标准值后的数字较大,然后将这两部分再进行排序操作(我们使用的是递归的方式)

这样讲的太抽象 下面我,我们看一下代码:

#include<stdio.h>
//快速排序(挖坑填补法):设定标准值(一般设定为首元素),先从后向前找比标准值小的数,找到之后放入标准值位置;再从前向后找比标准值大的数放入刚才找到的位置,最后将空位插入标准值,
//标准值将前后划分开,标准值之前的书都比标准值小,标准值后的数都比标准值大
int Sort(int arr[],int nLow,int nHigh)
{
	int temp;
	temp = arr[nLow];//将第一位设定为标准值

	while(nLow < nHigh)
	{
		//从后向前找比标准值小的
		while(nHigh > nLow)
		{
			if(arr[nHigh] < temp)
			{
				//找到之后,放到标准值位
				arr[nLow] = arr[nHigh];
				nLow++;
				break;
			}
			nHigh--;
		}

		//从前向后找比标准值大的
		while(nLow < nHigh)
		{
			if(arr[nLow] > temp)//找到之后放到上一轮循环中的已经修改的最大位置
			{
				arr[nHigh] = arr[nLow];
				nHigh--;
				break;
			}
			nLow++;
		}
	}

	//nMin>=nMax时,循环条件结束,标准值放入,并将位置返回
	arr[nLow] = temp;//此时nLow和nHigh相同
	return nLow;
}




void QuickSort(int arr[],int nLow,int nHigh)
{
	//递归循环的结束条件
	if(arr == NULL|| nLow >= nHigh)return;

	//招标准值位置
	int nStandard;
	nStandard = Sort(arr,nLow,nHigh);

	//根据标准值位置 将数组分成两部分 各部分分别执行以上操作
	QuickSort(arr,nLow,nStandard-1);
	QuickSort(arr,nStandard+1,nHigh);
}

int main()
{
	int arr[] = {10,9,20,39,441,709,27,11,87};
	QuickSort(arr,0,sizeof(arr)/sizeof(arr[0])-1);

	int i;
	for(i = 0;i<sizeof(arr)/sizeof(arr[0]);i++)
	{
		printf("%d ",arr[i]);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/aaa_cainiao_66666/article/details/81587527
今日推荐