《算法导论》 第7章 快速排序

1. 快速排序的描述

像合并排序一样,快速排序也是基于分治模式的。下面是对一个典型子数组A[p..r]排序的分治过程的三个步骤:

分解:数组A[p..r]被划分成两个(可能空)子数组A[p..q-1]和A[q+1..r],使得A[p..q-1]中的每个元素都小于等于A[q],而且,小于等于A[q+1..r]中的元素。下标q也在这个划分过程中进行计算。

解决: 通过递归调硫,对子数组A[p..q-1]和A[q+1..r]排序

合并:因为两个子数组是就地排序的,将它们的合并不需要操作:整个数组和A[p..r]己排序。


下面的过程实现快速排序:

Quicksort(A,p,r)

if p<r

then q = Partition(A,p,r)

Qurcksort(A,p,q-1);

Qurcksort(A,q+1,r);


为排序一个完整的数组A,jbpur调用是Qurcksort(A,0,length[A]-1)(有0号元素)

数组划分

快速排序算法的关键是Partition过程,它对子数组A[p..r]进行就地重排:


Partition(A,p,r)

x = A[r];

i = p-1;

for j = p to r-1

do if A[j]<=x

then i = i+1;

Exchange (A[i],A[j])

Exchange(A[i+1],A[r])

return i+1;


C++ 语言实现程序如下。。。可直接复制运用。。。

#include<iostream>
using namespace std;

void Exchange(int &a,int &b)
{
	int i = a;
	a = b;
	b = i;
};

int Partition(int *A,int p,int r)
{
	int x = A[r];
	int i = p-1;

	for(int j = p;j<r;j++)
	{
		int y = A[j];
		if(A[j]<=x)
		{
			i++;
			Exchange(A[i],A[j]);
		}
	}
	Exchange(A[i+1],A[r]);
	return i+1;
};

void Quicksort(int *A,int p,int r)
{
	if(p<r)
	{
		int q = Partition(A,p,r);
		Quicksort(A,p,q-1);
		Quicksort(A,q+1,r);
	}
};

void main()
{
	int A[8] = {2,8,7,1,3,5,6,4};
	Quicksort(A,0,7);
	for(int i = 0;i<8;i++)
	{
		cout<<A[i]<<endl;
	}
}

你可能感兴趣的:(《算法导论》 第7章 快速排序)