快速排序的非递归写法

最近看到快手有在问这个快速排序的非递归写法,我们左右边界打包成一个points丢到一个队列(栈)中每一次去取一个数据来进行partition直到这个队列(栈)为空。

#include 
#define random(x) rand()%x
std::vector<int>nums(10,0);
void display(){
    for(auto& value : nums){
        std::cout<<value<<' ';
    }
    std::cout<<std::endl;
}
void init(){
     for(int i = 0; i < nums.size(); ++i){
          nums[i] = random(100);
     }
}
struct points{
    int left;
    int right;
    points(int left, int right):left(left), right(right){}
};
int Partition(int left, int right){
    int tmp = nums[left];
    while(left < right){
        while(left < right && nums[right] > tmp) --right;
        std::swap(nums[right],nums[left]);
        while(left < right && nums[left] <= tmp) ++left;
        std::swap(nums[left],nums[right]);
    }
    nums[left] = tmp;
    display();
    return left;
}
std::queue<points>Q;
void QuickSort(int left, int right){
     Q.push(points(left,right));
     while(!Q.empty()){
        points tmp = Q.front();
        int index = Partition(tmp.left, tmp.right);
        if(tmp.left < index - 1){
            Q.push(points(tmp.left, index - 1));
        }
        if(index + 1 < tmp.right){
           Q.push(points(index + 1, tmp.right));
        }
        Q.pop();
     }
}
int main(){
    init();
    std::cout<<"initial data: ";
    display();
    QuickSort(0, nums.size() - 1);
    display();
    std::getchar();


}

你可能感兴趣的:(c++,算法,数据结构)