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

    大致思路是选择一个pivot元素, 然后比它的排在其右边,小的排左边。 

    一般需要两个下标标记。

    5 6 7 1 3 2   5 :选择5为pivot。

                       i/big

    5 6 7 1 3   2    5:

                   i/big

    5  6   7   1   3     2     5

             i                big          //swap(i, big)

    5 6    2    1   3     7    5  

        i              big

    5  3   2   1    6     7     5

                  big                //swap(big, pivot)

    1   3   2   5   6    7      5

                   pivot         //最后递归

    if(a[i] >= pivot)    if(i!=big) swap(arr[i], arr[big]); big--;

    代码如下:

    #include <iostream>
    #include <vector>
    using namespace std;
    void swap(int &a, int &b)
    {
        int tmp = a;
        a = b;
        b = tmp;
    
    }
    
    int sort(vector<int> &arr, int start, int end)
    {
        int pivot = arr[start];
        int big = end;
        for(int i = end; i > start; i--)
        {
            cout << arr[i] << ",";
            if(arr[i]>= pivot) {
                if(big != i) {
                    swap(arr[i], arr[big]);
                }
                big--;
            }
        }
        swap(arr[start], arr[big]);
        return big;
    }
    
    
    void quicksort(vector<int> &arr, int start, int end)
    {
        //cout << ""
        if(start < end){
            int mid = sort(arr, start, end);
            cout << "mid:" << mid << endl;
            quicksort(arr, start, mid-1);
            quicksort(arr, mid+1, end);
        }
    }
    
    int main()
    {
        vector<int> a{1,0,0,1,1,0,0,1,1};
        quicksort(a, 0, 8);
        for(int i = 0; i < 9; i++)
        cout << a[i] << ",";
    
    }

    第二种方法是两边设置快慢指针,如果左边指针元素大于pivot且右边小于pivot,两者调换,

    但是判断边界条件的时候容易出错。

    #include <vector>
    #include <iostream>
    using namespace std;
    void swap(int &a, int &b)
    {
        int tmp = a;
        a = b;
        b = tmp;
    }
    
    void quicksort(vector<int>&arr, int start, int end)
    {
        if(start < end){
        int pivot = arr[start];
        int i = start+1;
        int j = end;
        while(i < j) {
            if(i < j && arr[i]<= pivot) {
                i++;
            }
            if(i < j && arr[j] > pivot) {
                j--;
            }
            if(i < j&& arr[i] > pivot && arr[j] <= pivot)
            {
                swap(arr[i], arr[j]);
                i++;
                j--;
                for(int i = 0; i < arr.size(); i++){
                    cout << arr[i] << ",";
                }
                cout << endl;
            }
        }
    //判断边界条件
        if(i == j) {
            if(arr[i] <= pivot) {
                swap(arr[i], arr[start]);
                quicksort(arr, start, i-1);
                quicksort(arr, i+1, end);
                
            } else {
                swap(arr[i-1], arr[start]);
                quicksort(arr, start, i-2);
                quicksort(arr, i, end);
            }
        } else {
            swap(arr[j], arr[start]);
            quicksort(arr, start, j-1);
            quicksort(arr, j+1, end);
        }        
        }
    
    }
    The Safest Way to Get what you Want is to Try and Deserve What you Want.
  • 相关阅读:
    windows根据指定编码启动jar包
    Ioc/DI和Aop(2)
    SpringIOC和AOP原理 设计模式(3)
    nacos安装与基础配置
    jvm内存参数解析
    springboot集成多数据源
    linux常见命令
    idea常见问题
    GSP
    GSP
  • 原文地址:https://www.cnblogs.com/Shinered/p/11684048.html
Copyright © 2011-2022 走看看