(5)快速排序
快速排序是对冒泡排序的一种改进,基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
例如将数组R={6, 8, 7, 9, 0,1, 2, 3, 4, 5}从小到大排序
(1)在数组中任取一个数作为基准数,可以随机取,或者取中间的数,一般是取每次递归的第一个元素,该数组中取temp=R[0] =6,i=1,j=9
(2)以temp 为基准将数组中的数划分为两部分,左边比temp都小,右边比temp都大,具体过程如下
a.从右边,即j=9开始,找到第一个比temp小的数,R中为R[9]=5,与R[i]=R[0]交换, 交换后顺序为{5, 8, 7, 9, 0,1, 2, 3, 4, &}(&暂时空缺)
b.a中找出一个数以后从左边,即i=1(i=0可以跳过)开始,找到第一个比temp大的数,R中为R[1]=8,与R[j]=R[9] 交换,交换后顺序为{5, &, 7, 9, 0,1, 2, 3, 4, 8}(&暂时空缺)
c.再从右边开始找,一直到i>=j时结束
(3)一趟快速排序过程如下图
一趟排序以后数组分为(5,4,2,3,0,1)(9,7,8)两部分,再分别对这两个数组递归排序
完整程序
#include <cstdlib>
#include <iostream>
using namespace std;
int Partition(int R[], int l, int r)
{
int i = l, j = r+1, temp = R[l];
while(i < j){
//从右开始找到第一个小于temp的数
while(i < j && R[--j] > temp);
R[i] = R[j];
//从左开始找到第一个大于temp的数
while(i < j && R[++i] < temp);
R[j] = R[i];
}
R[j] = temp;
return j;
}
void QuickSort(int R[], int l, int r)
{
if(l<r){
int p = Partition(R,l,r);
//对左区间排序
QuickSort(R,l,p-1);
//对右区间排序
QuickSort(R,p+1,r);
}
}
int main()
{
int R[] = {6, 8, 7, 9, 0,
1, 2, 3, 4, 5};
int n = 10;
QuickSort(R, 0, n-1);
for(int i = 0; i < n; i++){
cout<<R[i]<<" ";
}
cout<<endl;
system("PAUSE");
return 0;
}