快速排序(降序):
原理:
整个过程分为
(1)校准基准数(选择最左边的一个数)。
选定最左边的一个数(基准数),通过交换使得小于它的数都在它的左侧,大于它的数在它的右侧。
(2)分治。
对基准数左边和右边的数进行步骤(1)。
#步骤(1)中交换的方法:
a.在一个序列的数字中,最左边标记为i,最右边标记为j;
b.先从右往左边扫,直到遇见一个小于基准数的数,停下;
c.再从左往右边扫,直到遇见一个大于基准数的数,停下;
d.互换这两个数,继续扫,直到 i 与 j 相等。
时间复杂度:最坏可能达到 O(n²),平均时间复杂度为 O(nlogn)。
C++实现:
#include<iostream>
using namespace std;
int a[100]; // 为测试方便,采用全局变量;亦可作为函数参数传入。
void quicksort(int left,int right)
{
if(left >= right)
return;
int temp,i,j;
i = left; // i为最左边的标志;
j = right;// j为最右边的标志;
temp = a[left]; //总是取最左边的数为基准数;
while(i!=j)
{
while(i<j && a[j]>=temp) //先从右边开始,只有满足a[j] < temp 时才停下;
j--;
while(i<j && a[i]<=temp) //只有满足a[j] > temp 时才停下;
i++;
swap(a[i],a[j]); // 大的放右边,小的放左边
}
a[left] = a[i];// 基准数归位
a[i] = temp;
quicksort(left,i-1); //递归处理左侧;
quicksort(i+1,right); //递归处理右侧;
}
int main()
{
cin >> n;
for(int i=0;i<n;i++)
cin >> a[i];
quicksort(0,n-1);
for(int i=0;i<n-1;i++)
cout << a[i] <<" ";
cout << a[n-1] << endl;
return 0;
}
下图为 《啊哈!算法》一书中讲到快速排序时的配图,附上便于理解