您的位置:首页 > 其它

快速排序【模板】

2016-03-22 07:35 381 查看

一、递归版本

手打递归版本

#include <iostream>

//引用地址空间
void swap(int &a, int &b)
{
int tmp = a;
a = b;
b = tmp;
}

void quickSort(int *arr, int left, int right) {

if (left >= right)
return;

int i = left, j = right;
int standard = arr[left];

while (i < j) {

//find some elements bigger than standard
while (i < j && arr[i] < standard)
++i;

//find some elements smaller than standard
while (i<j && arr[j] > standard)
--j;

//exchange arr.i and arr.j
swap(arr[i], arr[j]);
}
// i == j where the standard should be

quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}

int main()
{
int A[6] = { 0, 5, 3, 2, 1, 4 };

quickSort(A, 1, 5);

for (int i = 1; i <= 5; i++)
printf("%d ", A[i]);

return 0;
}


《数据结构理论与实践》版本:

int Partition(int *arr, int i,int j) {

arr[0] = arr[i]; //arr[0] is a temp space

while(i<j) {

while(i<j && arr[j] >= arr[0]) --j;

if( i < j) { //move the smaller element to the front
arr[i] = arr[j];
++i;
}

while(i<j && arr[i] < arr[0]) ++i;

if( i < j) { //move the bigger element to the tail
arr[j] = arr[i];
--j;
}
}

arr[i] = arr[0];
return i;
}

void quickSort(int *arr, int left,int right) {

int i;
if(left<right) {
i = Partition(arr,left,right); //divide the arr into 2 parts
quickSort(arr,left,i-1);
quickSort(arr,i+1,right);
}
}


上面的版本都会有TLE

递归改进版(poj 2623 AC):

void quickSort(int *arr, int left, int right){
int i = left, j = right;
int mid = arr[(i+j)/2];
while(i <= j){
while(arr[i] < mid) i ++;
while(arr[j] > mid) j --;
if(i <= j){
int tmp;
tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
i ++; j --;
}
}
if(i < right) quickSort(arr,i, right);
if(left < j) quickSort(arr,left, j);
}


二、非递归版本

/**使用栈的非递归快速排序**/
template<typename Comparable>
void quicksort2(vector<Comparable>
&vec,int low,int high){
stack<int>
st;
if(low<high){
int mid=partition(vec,low,high);
if(low<mid-1){
st.push(low);
st.push(mid-1);
}
if(mid+1<high){
st.push(mid+1);
st.push(high);
}
//其实就是用栈保存每一个待排序子串的首尾元素下标,下一次while循环时取出这个范围,对这段子序列进行partition操作
while(!st.empty()){
int q=st.top();
st.pop();
int p=st.top();
st.pop();
mid=partition(vec,p,q);
if(p<mid-1){
st.push(p);
st.push(mid-1);
}
if(mid+1<q){
st.push(mid+1);
st.push(q);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: