您的位置:首页 > 产品设计 > UI/UE

快速排序-QuickSort

2015-08-25 17:57 537 查看
快速排序主要应用了分治的思想。

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

分治模型在每一层递归上都有三个步骤:

-分解(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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息