非递归版本的快速排序

来源:互联网 发布:网络暴力英语ppt 编辑:程序博客网 时间:2024/05/19 16:48
       快速排序:每次选择一个枢轴,比枢轴大的元素放在数组的右半部分,比枢轴小的元素放在数组的左半部分。然后递归的进入数组的左右两半部分。如果要用非递归来实现,我们需要用栈来保存数组左右两半部分的边界。代码如下:
int partition(vector<int> &nums, int start, int last){int val = nums[last];while (start < last){while (start < last && nums[start] <= val)start++;if (start < last){nums[last] = nums[start];last--;}while (start < last && nums[last] >= val){last--;}if (start < last){nums[start] = nums[last];start++;}}nums[start] = val;return start;}void quick_sort(vector<int> &nums, int start, int last){if (start < last){//保存数组两半部分的边界stack<int> s;s.push(start);s.push(last);//判断栈是否为空while (!s.empty()){last = s.top();s.pop();start = s.top();s.pop();int pos = partition(nums, start, last);//当前数组的左半部分边界入栈if (pos - 1 > start){s.push(start);s.push(pos - 1);}//当前数组的右半部分边界入栈if (pos + 1 < last){s.push(pos + 1);s.push(last);}}}}

0 0
原创粉丝点击