/*
六、快速排序(Quick Sort)
算法思想:
快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,
排序 n 个项目要Ο(n logn)次比较。在最坏状况下则需要Ο(n2)次比较,
但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快
,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来
快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为
两个子串行(sub-lists)。
算法步骤:
从数列中挑出一个元素,称为 “基准”(key)。
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的
摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处
于数列的中间位置。这个称为分区(partition)操作。
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。
虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,
它至少会把一个元素摆到它最后的位置去。
算法代码:
#include <iostream>
using namespace std;
void print(int a[], int n){
for(int j= 0; j<n; j++){
cout<<a[j] <<" ";
}
cout<<endl;
}
void swap(int *a, int *b){
int tmp = *a;
*a = *b;
*b = tmp;
}
int partition(int a[], int low, int high){
int Key = a[low]; //基准元素
while(low < high){ //从表的两端交替地向中间扫描
while(low < high && a[high] >= Key) --high;
swap(&a[low], &a[high]);
while(low < high && a[low] <= Key ) ++low;
swap(&a[low], &a[high]);
}
;print(a,10);
return low;
}
void quickSort(int a[], int low, int high){
if(low < high){
int Loc = partition(a, low, high); //将表一分为二
quickSort(a, low, Loc -1); //递归对低子表递归排序
quickSort(a, Loc + 1, high); //递归对高子表递归排序
}
}
int main(){
int a[10] = {3,1,5,7,2,4,9,6,10,8};
cout<<"初始值:";
print(a,10);
quickSort(a,0,9);
cout<<"结果:";
print(a,10);
}