• 复习:几个常见排序的实现


    typedef vector<int> Container;
    
    void printVec(const Container& data)
    {
        for(int i : data)
            printf("%d ", i);
        printf("
    ");
    }
    
    void checkSort(function<Container(Container)> sortFunc)
    {
        printVec(sortFunc(Container{}));
        printVec(sortFunc(Container{0}));
        printVec(sortFunc(Container{-1, 0}));
        printVec(sortFunc(Container{12, -3, 23, -3, 23}));
    }
    
    Container BubbleSort(Container data)
    {
        const int size = data.size ();
        for(int i= 0; i != size; ++i)
            for(int j = 0; j != size - 1 - i; ++j)
                if(data[j] > data[j + 1])
                    swap(data[j], data[j + 1]);
        return data;
    }
    
    Container selectSort(Container data)
    {
        for(auto it = data.begin (); it != data.end (); ++it)
            swap(*it, *min_element(it, data.end ()));
        return data;
    }
    
    pair<int, int> partition(Container& data, int left, int right)
    {
        assert(left <= right);
        const int pivot = data[right];
        int lowerBound = left;
        int pivotBound = right;
        for(int i = left; i != pivotBound;){
            if(data[i] < pivot)
                swap(data[i++], data[lowerBound++]);
            else if(data[i] == pivot)
                swap(data[i], data[--pivotBound]);
            else
                ++i;
        }
        // Now lowerBound to pivotBound is higher section,
        // and pivot to right is pivots section.
        int offset = min(pivotBound - lowerBound, right - pivotBound + 1);
        for(int i = 0; i !=  offset; ++i){
            swap(data[lowerBound + i], data[right - i]);
        }
        // return lower's tail and higher's head.
        return {lowerBound, right - pivotBound + lowerBound};
    }
    
    void quickSortIt(Container& data, int left, int right)
    {
        if(left < right){
            auto pivotRange = partition (data, left, right);
            quickSortIt (data, left, pivotRange.first - 1);
            quickSortIt (data, pivotRange.second + 1, right);
        }
    }
    
    Container quickSort(Container data)
    {
        if(data.empty())
            return data;
        quickSortIt(data, 0, data.size () - 1);
        return data;
    }
    
    Container quickSortII(Container data)
    {
        if(data.empty())
            return data;
        auto partition = [&](int left, int right)
        {
            const int pivot = data[right];
            int lowerBound = left;
            int pivotsBound = right;
            for(int i = 0; i != pivotsBound;){
                if(data[i] < pivot)
                    swap(data[i++], data[lowerBound++]);
                else if(data[i] == pivot)
                    swap(data[i], data[--pivotsBound]);
                else
                    ++i;
            }
            const int offset = min(pivotsBound - lowerBound, right - pivotsBound + 1);
            for(int i = 0; i != offset; ++i){
                swap(data[lowerBound + i], data[right - i]);
            }
            return make_pair(lowerBound, right - pivotsBound + lowerBound);
        };
    
        function<void(int, int)> quickSortIt;
        quickSortIt = [&](int left, int right)
        {
            if(left < right){
                auto range = partition(left, right);
                quickSortIt(left, range.first - 1);
                quickSortIt(range.second + 1, right);
            }
        };
        quickSortIt(0, data.size() - 1);
        return data;
    }
  • 相关阅读:
    GCD实现多个定时器,完美避过NSTimer的三大缺陷(RunLoop、Thread、Leaks)
    iOS适配UIViewView/WKWebView,H5生成长图,仿微信进度条
    翻译jquery官方的插件制作方法
    javascript引用和赋值
    薯片公司真实JS面试题(乐视TV)
    caller、call、apply、callee的用法和意思
    常用javascript类型判断
    Git 常用命令笔记(不定期持续记录)
    sublime text2 emmet 安装
    hash"#"
  • 原文地址:https://www.cnblogs.com/wuOverflow/p/5666618.html
Copyright © 2020-2023  润新知