快速排序的非递归实现(利用栈)
基本步骤:
1.在一次划分的基础上,把被划分两边待排序列的的最左、最右元素依次入栈
2.栈非空时,取栈顶的两个元素,**先出的作为right,后出的作为left,**把它们作为下一次待排序元素区间
3.然后在新的区间的基础上,找基准值…重复上述步骤
4.如果被基准值划分的左右两个区间范围内只有一个元素,则不需要执行入栈操作
注:快排是所有内部排序算法中平均性能最优的算法。
相关代码如下:
void Quick_sort(int[] array, int left, int right) {
Stack<Integer> stack = new Stack<Integer>();
// 先找基准值
int partition = Partition(array, left, right);
// 基准值两边的左、右两部分的元素不是只有一个
if (left + 1 < partition) {
// 被划分左边序列的最左、最右元素下标依次入栈
stack.push(left);
stack.push(partition - 1);
}
if (partition + 1 < right) {
// 被划分右边序列的最左、最右元素下标依次入栈
stack.push(partition + 1);
stack.push(right);
}
while (!stack.isEmpty()) {
// 非空时,栈顶的两个元素出栈(依次为right、left)
right = stack.pop();
left = stack.pop();
// 新的left、right值作为下一次待排序的区间,然后找基准值,重复上述步骤,直到栈为空
partition = Partition(array, left, right);
if (left + 1 < partition) {
// 被划分左边序列的最左、最右元素下标依次入栈
stack.push(left);
stack.push(partition - 1);
}
if (partition + 1 < right) {
// 被划分右边序列的最左、最右元素下标依次入栈
stack.push(partition + 1);
stack.push(right);
}
}
//找基准值
int Partition(int[] array, int left, int right) {
int pivot = array[left];
while (left < right) {
while (left < right && array[right] >= pivot) {
right--;
}
Swap(array, left, right);
while (left < right && array[left] < pivot) {
left++;
}
Swap(array, left, right);
}
array[left] = pivot;
return left;
}
//交换数组中的两个元素的值
void Swap(int[] array, int i, int j) {
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}