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);
}
}
快速选择算法的递归和非递归方法
最新推荐文章于 2023-03-18 10:06:50 发布