快速排序的非递归实现
快速排序的递归实现在数据量非常大的时候往往因为递归的层数过多而导致栈溢出,可以考虑模拟递归栈的调用,用一个堆空间中的辅助栈保存每次计算的中间参数,将快排改为非递归版本,实现如下:
1 int Partition(vector<int> &numbers, int begin, int end) 2 { 3 int tmp=numbers[begin]; 4 while(begin<end) 5 { 6 while(begin<end && numbers[end]>=tmp)--end; 7 numbers[begin]=numbers[end]; 8 while(begin<end && numbers[begin]<=tmp)++begin; 9 numbers[end]=numbers[begin]; 10 } 11 numbers[begin]=tmp; 12 return begin; 13 } 14 void QuickSort(vector<int> &numbers) 15 { 16 if(numbers.size()<=1)return; 17 vector<int> stack; 18 stack.push_back(numbers.size()-1); 19 stack.push_back(0); 20 while(stack.size()) 21 { 22 int i=stack.back(); 23 stack.pop_back(); 24 int j=stack.back(); 25 stack.pop_back(); 26 int mid=Partition(numbers, i, j); 27 if(mid-1>i) 28 { 29 stack.push_back(mid-1); 30 stack.push_back(i); 31 } 32 if(mid+1<j) 33 { 34 stack.push_back(j); 35 stack.push_back(mid+1); 36 } 37 } 38 }