快速选择算法的递归和非递归方法

import java.util.Scanner;

public class Main {
	private static int arr[];

	public static int lomuto(int arr[], int l, int r) {// lomuto排序
		int p = arr[l];
		int s = l;
		for (int i = l + 1; i <= r; i++) {
			if (arr[i] > p) {
				continue;
			} else {
				s++;
				swap(arr, s, i);
			}
		}
		swap(arr, s, l);
		return s;

	}

	public static void swap(int arr[], int a, int b) {// 交换数字
		int swap = arr[a];
		arr[a] = arr[b];
		arr[b] = swap;
	}

	public static void quickSelect(int k, int l, int r) {// 递归
		int s = lomuto(arr, l, r) - l;// 相对位置
		if (s == k - 1) {
			int xx = s + l + 1;
			System.out.println("第" + xx + "小的数是:" + arr[s + l]);
		} else if (s > k - 1) {
			quickSelect(k, l, s - 1 + l);// 绝对位置
		}
		if (s < k - 1) {
			quickSelect(k - s - 1, s + 1 + l, r);// 绝对位置
		}
	}

	public static void quickSelect2(int k, int l, int r) {// 非递归
		int s = lomuto(arr, l, r);
		while (s != k - 1) {
			if (s > k - 1)
				s = lomuto(arr, l, s - 1);
			else {
				s = lomuto(arr, s + 1, r);
			}
		}
		System.out.println("第" + k + "小的数是:" + arr[k - 1]);

	}

	public static int[] gennerateArray(int len, int max) {// 随机数组
		arr = new int[len];
		for (int i = 0; i < arr.length; i++) {
			arr[i] = (int) (Math.random() * max);
		}
		return arr;
	}

	public static void main(String args[]) {
		@SuppressWarnings("resource")
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入随机数组的大小和最大值:");
		int len = sc.nextInt();
		int max = sc.nextInt();
		gennerateArray(len, max);
		System.out.println("数组为:");
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + " ");
		}
		System.out.println("\n"+"请输入想要查找的第i小的数的i值:");
		int x = sc.nextInt();
		System.out.println("递归查找结果:");
		quickSelect(x, 0, len - 1);
		System.out.println("非递归查找结果:");
		quickSelect2(x, 0, len - 1);

	}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值