快速排序非递归实现

来源:互联网 发布:抗日知乎 编辑:程序博客网 时间:2024/05/24 23:12
#include "stack"#include "stdio.h"#include "vector"using namespace std;void swap1(int& a,int& b){int temp=a;a=b;b=temp;}//强大的异或,不需要用到暂时变量就可以实现二者互换void swap2(int& a,int& b){if (a!=b) {a^=b;b^=a;a^=b;}}int partition1(int a[],int l,int r){int i=l;int x=a[i];for(int k=l+1;k<=r;k++) {if (a[k]<x){i++;if (i<k)swap2(a[i],a[k]);}}swap1(a[l],a[i]);return i;}//这个是第一次转化成递归以后的算法,递归转化为非递归,总是离不开if,whilevoid Non_recursive_quicksort1(int a[], int low, int high){stack<int> st;if(low < high){int pivot = partition1(a, low, high);st.push(low);st.push(pivot - 1);st.push(pivot + 1);st.push(high);   //栈初始化while(!st.empty())//当栈不空的时候,说明元素还没排好序,执行{high = st.top();st.pop();low = st.top();st.pop();     //弹栈到low,high,为partition 做准备pivot = partition1(a, low, high); //找枢点,将区间继续划分if(low < high) //这一点很重要,因为如果low=high,只有一个元素时,不需要再压栈做partition{st.push(low);st.push(pivot - 1);st.push(pivot + 1);st.push(high);    //将小区间压入栈,但是有缺陷,因为low,pivot-1有可能相等,有可能将两个无需要再划分的区间压入栈}}}}void Non_recursive_quicksort2(int pData[], int low, int high){stack<int> st;int tmp;if(low < high){int pivot = partition1(pData, low, high);st.push(low);st.push(pivot - 1);st.push(pivot + 1);st.push(high);while(!st.empty()){high = st.top();st.pop();low = st.top();st.pop();if(low < high){pivot = partition1(pData, low, high);tmp = pivot - 1;if(low < tmp){st.push(low);//改进了这里,当数组元素只有1个时,不做任何处理st.push(tmp);}tmp = pivot + 1;if(tmp < high){st.push(tmp);st.push(high);}}}}}void main(){int a[]={1,5,2,4,1,5,3,6,8,0,5,3,7,8,0};Non_recursive_quicksort2(a,0,14);for(int i=0;i<14;i++)printf("%d ",a[i]);}

原创粉丝点击