数据结构——快速排序

1、排序思路

快速排序(quick sort)是由冒泡排序改进而得得,它的基本思想是在待排序的n个元素中n个元素中任取一个元素(通常取第一个元素)作为基准,把该元素放入适当的位置后,数据序列被此元素划分成两部分。所有关键字比该元素关键字小的放置在前一部分,所有关键字比该元素关键字大的放置在后一部分,并把该元素排在这两部分中间(称该元素归为),这个过程称为一趟快速排序,即一趟划分。

  之后对产生的两个部分分别重复上述过程,直至每部分内只有一个元素或空为止。

  一趟快速排序的划分过程partition(R,s,t)是采用从两头向中间扫描的办法,同时交换与基准元素逆序的元素。具体方法是设两个指示器i和j,它们的初值分别为指向无序区中的第一个和最后一个元素。假设无序区中的元素为R[s],R[s+1],…,R[t],则i的初值为s,j的初值为t,首先将R[s]移至变量tmp中作为基准,令j自位置t起向前扫描直至R[j].keytmp.key时将R[i]移至位置j,依次重复直至i=j,此时所有 R[k](k = s,s+1,…,i-1)的关键字都小于tmp.key,而所有R[k](k = i+1,i+2,…,t)的关键字都大于tmp.key,此时再将tmp中的元素移至位置i,它将无序区中的元素分割成R[s…i-1]和R[i+1…t],以便分别进行分别排序。

  显然,快速排序时一个递归过程,其递归模型如下:

f(R,s,t)≡不做任何事情   当R[s…t]中没有元素或者只有一个元素时
f(R,s,t)≡i≡partition(R,s,t);    其他情况
              f(R,s,i-1);
              f(R,i+1,t);

2、排序算法

  快速排序算法如下:

int partition(RecType R[],int s,int t) //一趟划分
{
	int i = s,j = t;
	RecType tmp = R[i]; //以R[i]为基准
	while(i<j)  //从两端交替向中间扫描,直至i = j为止
	{
		while(j>i&&R[j].key>=tmp.key)
			j--;  //从右向左扫描,找一个小于基准的R[j]
		R[i] = R[j]; //找到这样的R[j],放入R[i]处
		while(i<j&&R[i].key<=tmp.key)
			i++; //从左向右扫描,找一个大于基准的R[i]
		R[j] = R[i]; //找到这样的R[i],放入R[j]处
	}
	R[i] = tmp; 
	return i;
}
void QuickSort(RceType R[],int s,int t)//对R[s..t]的元素进行快速排序
{
	int i;
	if(s<t) //区间内至少有两个元素的情况
	{
		i = partition(R,s,t);
		QuickSort(R,s,i-1); //对左区间递归排序
		QuickSort(R,i+1,t); //对右区间递归排序
	}
}

例子
设待排序的表有10个元素,其关键字分别为(6,8,7,9,0,1,3,2,4,5),采用快速排序方法进行排序的过程如下:
数据结构——快速排序_第1张图片

3、算法分析

  快速排序最好的情况是每一次划分都将n个元素划分为两个长度差不多相同的子区间,也就是说,每次划分所取的基准都是当前无序区的“中值”元素,划分的结果是基准的左、右两个无序子区间的长度大致相等,如图所示,这样的递归树高度为O(log2n),而每一层划分的时间为O(n),所以此时算法的时间复杂度为O(nlog2n)、空间复杂度为O(log2n).
数据结构——快速排序_第2张图片
  快速排序最坏的情况是每次划分选取的基准都是当前无序区中关键字最小(或最大)的元素,划分结果是基准左边的子区间为空(或者右边的子区间为空),而划分所得的另一个非空子区间中元素的数目仅比划分前的无序区间中的元素个数减少一个。这样的递归树高度为n,需要做n-1次划分,此时算法时间复杂度为O(n2)、空间复杂度为O(n)
  在平均情况下,每一次划分将n个元素划分为两个长度分别为k-1和n-k的子区间,k的取值范围是1~n,共n种情况,如图所示,设执行时间为Tavg(n),显然有:
  Tavg=cn+ 1 n \frac{1}{n} n1 ∑ k = 1 n \sum_{k=1}^{n} k=1n(Tavg(k-1)+Tavg(n-k))
由上式可以推出Tavg=O(nlog2n),其中cn表示划分的时间。
数据结构——快速排序_第3张图片
 由上述分析可知,快速排序最好的时间复杂度为O(nlog2n),最坏的时间复杂度为O(n 2),平均时间复杂度为O(nlog2n),平均空间复杂度为O(nlog2n)
 快速排序是一种不稳定的排序方法。实际上,在快速排序中可以以任意一个元素为基准。

你可能感兴趣的:(数据结构,数据结构,快速排序)