跟着《算法导论》学习——快速排序

读前声明:本人所写帖子主要为了记录本人学习的一个过程,无他想法,由于内容比较肤浅,如有雷同,非常正常!!!

本文内容:

本文主要是参考《算法导论》这本书,完成部分算法编写,可能编程习惯或者风格比较差,还请多多批评。

快速排序是一种排序算法,对包含n个数的输入数组,最坏情况运行时间为O(n^2),虽然这个最坏情况运行时间比较差,但快速排序通常是用于排序的最佳实用选择,这是因为其平均性能相当好,期望的运行时间是O(nlgn),且O(nlgn)记号中的隐含的常数因子很小。另外,它还能够进行就地排序,在虚存环境中也能很好的工作。

像归并排序一样,快速排序也是基于分治法进行的,下面湿对一个典型子数组排序分治的三个步骤:

分解:数组A[p,...,r]被划分为两个子数组(可能为空)A[p,...,q-1]和A[q+1,...,r],使得A[p,...,q-1]中的每个元素都小于等于A[q],A[q]小于等于A[q+1,...,r]中的元素;

解决:递归调用快速排序,对子数组A[p,...,q-1]和A[q+1,...,r]排序;

合并:因为两个子数组都是就地排序的,将它们合并不需要操作,整个数组即也排好序。

代码如下:

void QuickSort(int a[],int left,int right)
{
	if (left>=right)
	{
		return;
	}
	int p = Seperation(a,left,right);
	QuickSort(a,left,p);
	QuickSort(a,p+1,right);
}

上述代码中,含有一个非常重要的子函数,就是对数组进行重排过程,这一过程即是将参考值小的数移到数组左边,大的数移到数组右边,代码如下:

int Seperation(int a[],int left,int right)
{
	int temp = a[left];
	int i = left;
	for (int j=left+1;j<=right;j++)
	{
		if (a[j]<temp)
		{
			i++;
			if (i!=j)
			{
				int t = a[j];
				a[j] = a[i];
				a[i] = t;
			}
		}
	}
	a[left] = a[i];
	a[i] = temp;
	return i;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值