快速排序-QuickSort

来源:互联网 发布:淘宝怎么用余额宝分期 编辑:程序博客网 时间:2024/05/21 07:08

快速排序主要应用了分治的思想。

分治算法也叫分治策略,把输入分为若干个部分,递归的解每一个问题,最后将这些子问题合并成为一个全局解

分治模型在每一层递归上都有三个步骤:
-分解(Divide):将原问题分解成一系列子问题。
-解决(Conquer):递归的解各个子问题。若子问题足够小,则直接求解。
-合并(Combine):将子问题的结果合并成原问题的解。

快速排序的递归方法:

//分治的解决部分:partition函数

int partition(vector<int> &vec,int low,int high){    int comp=vec[low];    while(low<high){        while(low<high && vec[high] >= comp){            high--;        }        vec[low]=vec[high];        while(low<high && vec[low] <= comp){            low++;        }        vec[high]=vec[low];    }    vec[low]=comp;    return low;}

//分治的分解和合并:quickSort递归调用

void quickSort(vector<int> &vec,int low,int high){    if(low < high) {        int middle = partition(vec, low, high);        quickSort(vec, low, middle - 1);        quickSort(vec, middle + 1, high);    }}

快速排序的非递归方法:

//partition函数不变
……

//quickSort变成非递归
方法一、用栈模拟递归

void quickSort(vector<int> &vec,int low,int high){    stack<int> st;    int middle,l,h;    if(low<high){        st.push(low);        st.push(high);    }    while(!st.empty()){        h = st.top();        st.pop();        l = st.top();        st.pop();        middle = patition(vec, l, h);        if(l<middle-1){            st.push(l);            st.push(middle-1);        }        if(middle+1 < h){            st.push(middle+1);            st.push(h);        }    }}

方法二、用数组模拟栈,从而实现递归

void quickSort(int *a, int l, int h){    if (l>=h)        return;    int *s = new int[h-l+1];     //实现栈够用,因为存储的l,h索引在数组a的长度以内    int p = 0;    s[p++] = l;    s[p++] = h;    int low,high,mid;    while (p>0){        high = s[--p];        low = s[--p];        if(low<high) {            mid = partition(a, low, high);            if(low < mid-1){                s[p++] = low;                s[p++] = mid -1;            }            if(mid+1 < high){                s[p++] = mid+1;                s[p++] = high;            }        }    }    delete []s;}
0 0
原创粉丝点击