您的位置:首页 > 产品设计 > UI/UE

快速排序quicksort

2014-05-27 01:08 465 查看
快速排序,简称快排。快排的思想是通过一趟排序,使得带排序记录分割成两部分,其中一部分记录的关键字比另一部分小。之后在这两部分记录中再次调用上述方法,已达到整个记录有序。

假设在记录{ i, i+1, i+2, ... , j }, 随意选取一个记录,最为枢纽pivot(通常选第一个),按上述方法做一趟排序,并记录下pivot的位置k,然后得到两个序列,在它之前的记录都不小于它,在它之后的都大于它。然后得到以k为分界线的两个字序列{ i, i+1, ... , k-1} 和 { k+1, k+2, ... , j}。

具体做法是首先选取枢纽的关键字为pivot,然后选取头尾两个指针low与high,首先从high向前做比较,直到找到小于pivot的记录,然后与pivot的枢纽交换。之后从low向后找,找到大于pivot的记录,然后与pivot的枢纽交换,重复前两步,直到low = high.

示例代码

#include <iostream>
using namespace std;

int partition(int A[], int low, int high){
int pivot = A[low];
while(low < high){
while(low < high && A[high] >= pivot) high--;
A[low] = A[high];
while(low < high && A[low] <= pivot) low++;
A[high] = A[low];
}
A[low] = pivot;
return low;
}

void QSort(int A[], int low, int high){
if(low < high){
int pivot = partition(A, low, high);
QSort(A, low, pivot - 1);
QSort(A, pivot + 1, high);
}
}

void quicksort(int A[], int len){
QSort(A, 0, len);
}

int main(){
int A[] = {1,3,4,2,4,5,3,1,0};
quicksort(A, sizeof(A)/sizeof(int));
for(int i = 0; i < sizeof(A)/sizeof(int); i++)
cout << A[i] << " ";
cout << endl;
return 0;
}快速排序的平均时间是T(n) = knlnn, 其中n为带排序个数,k为某个常数,经验证明,在同数量级排序算法中,快排的常数因子k最小,因此就平均时间来说,快排是目前最好的一种内部排序算法。时间复杂度是O(nlogn),但是如果初始记录是有序或基本有序,快排就沦为冒泡了,时间复杂度变成O(n^2),
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息