zoukankan      html  css  js  c++  java
  • 快速排序算法

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

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

    时间复杂度: 最好: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
  • 相关阅读:
    关于 ng-include 在一个页面中加载另一个页面的路径问题
    model 弹出框放到一个html中
    7.Linux 的档案与目录管理
    深入剖析Guice(Google依赖注入框架)
    Guava:Immutable(不可变) 集合
    Annotation 注解
    entity 的特别用法
    slf4j
    jsfl 将库中声音放置到时间轴上
    jsfl 读取xml
  • 原文地址:https://www.cnblogs.com/tommychok/p/5043735.html
Copyright © 2011-2022 走看看