• 【排序】快速排序,C++实现


    原创博文,转载请注明出处!

    本文代码的github地址

    # 基本思想

          ”快速排序“是对”冒泡排序“的改进。

          基本原理:基于分治法,在待排线性表中取一个元素pivot作为枢轴值,通过一趟排序将待排线性表划分为独立的两部分,第一部分的所有元素小于pivot,第二部分的所有元素大于等于pivot,pivot位于其最终位置。递归对两个子表做快速排序。

    # C++代码(递归和非递归)

    #include <iostream>
    #include <vector>
    using namespace std;
    
    // 一次快速排序
    int partition(vector<int> &a, int low, int high)
    {
        // 枢轴值(线性表第一个元素作为枢轴值)
        int key = a[low];
        while(low < high)
        {
            // 从右侧找小于pivot的值,替换low位置的元素
            while(low < high && a[high] >= key)
                --high;
            a[low] = a[high];
    
            // 从左侧找大于pivot的值,替换high位置的元素
            while(low < high && a[low] <= key)
                ++low;
            a[high] = a[low];
        }
        a[low] = key;
        
        return low;// 返回一趟排序后确定的元素位置
    }
    
    //快速排序的递归形式
    void QuickSort(vector<int> &a, int low, int high)
    {
        if(low < high)// 递归出口
        {
            int loc = partition(a, low, high);//一趟排序结果的调用
            QuickSort(a, low, loc-1);
            QuickSort(a, loc+1, high);
        }
    }
    
    int main()
    {
        vector<int> a={46,79,56,38,40,84};
        QuickSort(a, 0, a.size()-1);
    
        // 打印排序后的数组
        for(int i=0;i<a.size();++i)
            cout<<a[i]<<' ';
    
        return 0;
    }
    
    #include <iostream>
    #include <vector>
    #include <stack>
    using namespace std;
    
    int partion(vector<int> &root,int low,int high)
    {
        int part=root[low];
        while(low<high)
        {
            while(low<high&&root[high]>part)
                high--;
            root[low]=root[high];
    
            while(low<high&&root[low]<part)
                low++;
            root[high]=root[low];
        }
        root[low]=part;
        return low;
    }
    
    void quickSort(vector<int> &root,int low,int high)
    {
        stack<int> st;
        int k;
        if(low<high)
        {
            st.push(low);
            st.push(high);
            while(!st.empty())
            {
                int j=st.top();st.pop();
                int i=st.top();st.pop();
    
                k=partion(root,i,j);
    
                if(i<k-1)
                {
                    st.push(i);
                    st.push(k-1);
                }
                if(k+1<j)
                {
                    st.push(k+1);
                    st.push(j);
                }
            }
        }
    }
    
    int main()
    {
        vector<int> root = {4,2,6,7,9,5,1,3};
        quickSort(root,0,root.size());
        for(int i=0;i<8;i++)
            cout<<root[i]<<endl;
        return 0;
    }
    

      

  • 相关阅读:
    套接字I/O模型-WSAAsyncSelect
    套接字I/O模型-完成端口IOCP
    套接字I/O模型-WSAEventSelect(转载)
    Win7+VS2010环境下CEGUI 0.8.4编译过程详解
    数组去重统计排序
    计算当前月有几天
    前端开发仓库
    Jquery中bind(), live(), on(), delegate()四种注册事件的优缺点,建议使用on()
    图表那些事
    图标字体,矢量图标
  • 原文地址:https://www.cnblogs.com/wanglei5205/p/8732464.html
Copyright © 2020-2023  润新知