关于快速排序的总结

快速排序其实是冒泡排序的升级版,都具有交换排序的思想。大笑

快速排序通过一遍排序,将数据分为两部分,一部分数据都比另外一部分数据小,然后再分别对这两部分数据再进行此排序,直到排序结束。因此,此排序方法用到了递归。

下面来举个例子:(对69 65 90 37 92 6 28 54 八个数进行排序)   

69 65 90 37 92 6 28 54        //以数组的第一个元素为基准base

54 65 90 37 92 6 28 69        //从数组右侧开始,取出数据依次与base进行比较,直到找到小于base的数,然后两者进行交换

54 65 69 37 92 6 28 90        //从数组左侧开始,取出数据依次与base进行比较,直到找到大于base的数,然后两者进行交换

54 65 28 37 92 6 69 90        //从右侧开始,操作与上述相同

54 65 28 37 69 6 92 90        //从左侧开始,操作与上述相同

54 65 28 37 6 69 92 90        //到此步骤,base左边的数都比base小,base右边的数都比base大

然后再通过递归,将base左右两边的数继续按此方法排序,直到排序结束。

#include <stdio.h>
#define ARRAYLEN 10                                    //比较十个数
int Division(int a[],int left,int right);              //声明分割函数,返回基准的序号值
void QuickSort(int a[],int left,int right);            //声明快排函数
int main()
{
	int i,a[10];
	for(i=0;i<ARRAYLEN;i++)
		scanf("%d",&a[i]);
	QuickSort(a,0,ARRAYLEN-1);
	for(i=0;i<ARRAYLEN;i++)
		printf("%d ",a[i]);
	return 0;		
}

int Division(int a[],int left,int right)            //分割函数
{    
	int base=a[left];                            //取最左侧元素为基准元素
	while(left<right)                            //左侧序号小于右侧序号
	{
		while(left<right&&a[right]>base)            //从右向左找第一个比基准小的元素
			--right;
		a[left]=a[right];                            //将比基准小的数移到左侧
		while(left<right&&a[left]<base)            //从左向右找第一个比基准大的元素
			++left;
		a[right]=a[left];		            //将比基准大的数移到右侧
	}
	a[left]=base;                                        //保存基准数
	return left;                                        //返回基准序号
}

void QuickSort(int a[],int left, int right)
{
	if(left<right)                                         //当左侧序号小于右侧序号时执行此排序,否侧不执行
	{
		int i=Division(a,left,right);
		QuickSort(a,i+1,right);                    //对基准右侧的数据进行排序
		QuickSort(a,left,i-1);                     //对基准左侧的数据进行排序
	}
}


猜你喜欢

转载自blog.csdn.net/JackGong1999/article/details/79592824