快速排序-QuickSort

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

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

分治模型在每一层递归上都有三个步骤:
-分解(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;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值