[交换排序] 快速排序的非递归实现

快速排序的非递归实现(利用栈)

基本步骤:
  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;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值