快速排序的递归版本和非递归版本

我们通常见到的快速排序为递归版本,并没有关注非递归的方式。但非递归版本也是很好实现的,因为递归的本质是栈。在非递归实现的过程中,借助栈来保存中间变量就可以实现非递归了。在这里中间变量也就是通过Pritation函数划分之后分成左右两部分的首尾指针,只需要保存这两部分的首尾指针即可。具体代码如下

import java.util.Arrays;
import java.util.Stack;

/**
 * Time: 2019-06-13
 * Author: snowy
 * 快速排序, 递归版本和非递归版本
 * */

public class QuickSort {
	// 确定位置
    public static int partition(int[] nums, int left, int right) {
        int temp = nums[left];

        while(left < right) {
            while(left < right && nums[right] >= temp)		
                right --;
            if(left < right)		// 如果队尾元素小于temp了,需要将其赋值给left的位置,因为当前这个位置left上可以认为值是无效的
                nums[left] = nums[right];
            while(left < right && nums[left] <= temp)
                left ++;
            if(left < right)
                nums[right] = nums[left];
        }

        nums[right] = temp;

        return left;
    }

	// 快排递归版本
    public static void QuickSort(int[] nums, int start, int end) {
        if(start >= end)
            return;

        int station = partitation(nums, start, end);
        QuickSort(nums, start, station - 1);
        QuickSort(nums, station + 1, end);
    }


    // 快排的非递归写法
    public static void QuickSort_iter(int[] nums, int left, int right) {
        if(nums == null || left >= right)
            return;

        Stack<Integer> stack = new Stack<>();
//        int left = 0, right = nums.length - 1;

        int i , j;

        // 注意顺序
        stack.push(left);
        stack.push(right);

        while(!stack.isEmpty()) {
            // 这里需要注意顺序呀
            j = stack.pop();            // 先弹出右指针
            i = stack.pop();            // 在弹出左指针

            if(i < j) {
                int station = partition(nums, i, j);
                if(station > i) {
                    stack.push(i);
                    stack.push(station - 1);
                }
                if(station < j) {
                    stack.push(station + 1);
                    stack.push(j);
                }
            }
        }
    }

    public static void main(String[] args) {
        int[] nums = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
        System.out.println("排序前:" + Arrays.toString(nums));
        QuickSort_iter(nums, 0, nums.length - 1);
        System.out.println("排序后:" + Arrays.toString(nums));
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值