您的位置:首页 > 其它

快速排序

2015-11-27 11:15 330 查看
快速排序算法

O(N*logN)

//插入排序  从小到大排序
template<typename T>
void InsertionSort(T *A, int N){
int j, p;
T tmp;
for (p = 1; p < N; p++){
tmp = A[p];
for (j = p; j>0 && A[j-1] > tmp; j--){
A[j] = A[j - 1];
A[j - 1] = tmp;
}
}
}

//快速排序

const int CutOff = 3;  //截止范围,用来处理小数组。可以大于3
//对于很小的数组,快速排序不如插入排序好。
//也避免了一些有害的特殊情形,如“三数中值分割法”的实际只有一个或两个元素的情况。

//快速排序的驱动程序
template<typename T>
void QuickSort(T A[], int N){

Qsort(A, 0, N - 1);

}

template<typename T>
void Qsort(T A[], int Left, int Right){

if (Left + CutOff <= Right){  //元素个数大于CutOff=3,则一定可以使用“三数中值分割法”

int i = Left;
int j = Right;
//int center = (i + j) / 2;
T pivot = A[i];  //以第一个元素为枢纽元

while (i < j){
while (i<j && A[j]>pivot){
j--;
}
if (i < j){
A[i] = A[j];
//i++;
}

while (i < j && A[i] < pivot){
i++;
}
if (i < j){
A[j] = A[i];
//j--;
}

}
A[i] = pivot;
Qsort(A, Left, i - 1);  //递归调用
Qsort(A, i + 1, Right);

}
else{
InsertionSort(A + Left, Right - Left + 1);  //使用插入排序
}

}

////简单的确定枢纽元方法
//template<typename T>
//T Median3(T *&A, int Left,int Right){
//  int center = (Left + Right) / 2;
//
//  int tmp = A[center];
//  A[center] = A[Right - 1];
//  A[Right-1] = tmp;
//  return A[Right - 1];
//}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: