【排序】快速排序,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;
}

  

posted @ 2018-04-07 10:08  wanglei5205  阅读(968)  评论(0编辑  收藏  举报
levels of contents