您的位置:首页 > 其它

快速排序算法

2015-12-13 22:20 288 查看
快速排序的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

稳定性:快速排序是不稳定的排序

时间复杂度: 最好:O(nlogn)   最差:O(n^2)  辅助空间:O(logn) ~ O(n)

/* 快速排序算法 */
#include <cstdio>

/* 对给定的闭区间进行快速排序 */
void QSort(int* L, int low, int high){
if (low < high){
int fst = low, lst = high;
int key = L[fst]; //这样fst位置就空出来了
while (fst < lst){
//从后半部分找小于key的值放到前面
while (fst < lst && L[lst] >= key)
--lst;
//循环结束后lst位置即为小于key的地方
L[fst] = L[lst]; //这样lst位置就空出来了
//从前面找大于key的数放到后面
while (fst < lst && L[fst] <= key)
++fst;
L[lst] = L[fst]; //这样fst又空出来了
}
L[fst] = key; //枢轴记录到位
QSort(L, low, fst - 1);
QSort(L, fst + 1, high);
}
}

/* 对给定的左闭右开区间进行排序 --- 指针法 */
void QSort(int* low, int* high){
//high - low = 1表示只有一个元素无须排序
if (high - low > 1){
int* fst = low; //首元素
int* lst = high - 1; //尾元素
int key = *fst; //fst空出来了
while (fst < lst){
//从后面找比key小地元素放到前面
while (fst < lst && *lst >= key)
--lst;
*fst = *lst;
//从前面找比key大的元素放到后面
while (fst < lst && *fst <= key)
++fst;
*lst = *fst;
}
*fst = key; //枢轴记录到位
QSort(low, fst); //递归排序左闭右开区间
QSort(fst + 1, high); //递归排序左闭右开区间
}
}

/* 快速排序 --- 指针法降序版 左闭右开区间 */
void QSort2(int* low, int* high){
if (high - low > 1){
int* fst = low;
int* lst = high - 1;
int key = *fst; //fst位置空出来
//由于是降序,则比key大的放前面,比key小的放后面
while (fst < lst){
//从后面找比key大的放前面
while (fst < lst && *lst <= key)
--lst;
*fst = *lst; //这样lst空出来了
//从前面找比key小地放后面
while (fst < lst && *fst >= key)
++fst;
*lst = *fst; //fst空出来
}
*fst = key; //枢轴记录到位
QSort2(low, fst); //递归排序左闭右开区间
QSort2(fst + 1, high); //递归排序左闭右开区间
}
}

int main()
{
//int a[10] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
QSort2(a, a+5);
for (int i = 0; i < 10; ++i){
printf("%d ", a[i]);
}//for(i)

return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: