首页 > 编程语言 > 详细

快速排序算法

时间:2015-12-13 23:36:30      阅读:263      评论:0      收藏:0      [点我收藏+]

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

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

时间复杂度: 最好: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

 

快速排序算法

原文:http://www.cnblogs.com/tommychok/p/5043735.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!