排序算法之快速排序

       快速排序将以枢轴为界,将原数组分为两个部分,枢轴以前,值都小于枢轴的值,枢轴以后的值都大于枢轴。
       采用递归的方法,对以枢轴为界的两个子序列进行快速排序,直至子序列长度为1。
       1、快速排序的关键是枢轴的选取,主要有三种方法:1)选取第一个或最后一个作为枢轴值; 2)采用随机数生成器,生成枢轴值的下标;3)取第一个、最后一个、中间三者的中间值作为枢轴值,当数据量比较大的时候,甚至采取九数取中的方式。
       2、快速排序因为要递归,当需要排序的数组量比较小时,使用普通的排序算法效果可能更好,所以排序前可先进行判断,如果子序列长度大于阀值则采用快速排序,否则采用插入排序或选择排序等。

      相较于归并排序和堆排序,快速排序是一种高效而且简单的排序方法。

int partion(SqList* list, int low, int high)
{//返回枢轴下标
	int key = list->data[high];//枢轴值
	int fast = low;
	int slow = low;
	while (fast < high)
	{
		if (list->data[fast] < key)
		{
			if (slow != fast)
			{
				swap(list->data[fast], list->data[slow]);				
			}
			fast++;
			slow++;
		}
		else
		{
			fast++;
		}
	}
	swap(list->data[slow], list->data[high]);
	return slow;
}
void qsort1(SqList* list,int low,int high)
{
	if (low < high)
	{
		int index = partion(list,low,high);
		qsort1(list, low, index - 1);//高低子表都采用递归的方法实现
		qsort1(list, index + 1, high);
	}
}

#define MAX_LENGTH_INSERT_SORT 7//定义插入排序可以接受的最大数组
void qsort2(SqList* list, int low, int high)
{
	if ((high - low) > MAX_LENGTH_INSERT_SORT)
	{
		if (low < high)
		{
			int index = partion(list, low, high);
			qsort2(list, low, index - 1);
			qsort2(list, index + 1, high);
		}
	}
	else
		InsertSort2(list);
}
//只用一次递归,高子表采用迭代的方式,减小了递归的深度。
void qsort3(SqList* list, int low, int high)
{
	if ((high - low) > MAX_LENGTH_INSERT_SORT)
	{
		if (low < high)
		{
			int index = partion(list, low, high);
			qsort3(list, low, index - 1);
			low = index + 1;//高子表不递归,采用迭代
		}
	}
	else
		InsertSort2(list);//当然,此处不能直接使用,还需要对InsertSort2作一下修改,改成指定下标的形式
}
void QuickSort(SqList* list)
{
	qsort1(list,0,list->length-1);
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值