2008年4月22日星期二

算法——递归与分治之快速排序

快速排序的基本思想是,对于输入的子数组a[p:r],进行
(1)分解(Divide):以a[p]为基准元素将a[p:r]划分为三段a[p:q-1],a[q]和a[q+1:r].是a[p:q-1]中任何一个元素小于等于a[q],而a[q+1:r]中任何一个元素大于a[q].下表q在划分过程中确定.
(2)递归(Conquer):通过递归调用快速排序算法分别对a[p:q-1]和a[q+1,r]进行排序.
(3)合并(Merge):由于对a[p:q-1]和a[q+1:r]的排序是就地进行的,所以在a[p:q-1]和a[q+1:r]都已排好序后,不需要执行任何计算,a[p:r]就已排好序.

#include "iostream.h"

void QuickSort(int a[], int p, int r);
int Partition(int a[], int p, int r);
void print(int a[], int length);

int main(){
int a[] = {3, 5, 8, 2, 4, 7, 1};
print(a, 7);
QuickSort(a, 0, 6);

print(a, 7);

return 0;
}

void QuickSort(int a[], int p, int r)
{
if(p < r){
int q = Partition(a, p, r);
print(a, 7);
QuickSort(a, p, q-1);
print(a, 7);
QuickSort(a, q+1, r);
print(a, 7);
}
}

int Partition(int a[], int p, int r)
{
int i = p, j = r + 1;
int x = a[p];

while(true){
while(a[++i] < x && i < r);
while(a[--j] > x);
if(i >= j)
break;
//Swap(a[i], a[j]);
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
a[p] = a[j];
a[j] = x;

return j;
}

void print(int a[], int length)
{
for(int i = 0; i < length; i++){
cout << a[i] << ", ";
}
cout << endl;
}

没有评论: