package com.flyingh.demo;
import java.util.Random;
public class Demo {
public static void main(String[] args) {
int[] arr = { 3, 6, 5, 8, 7, 2, 1, 9, 0, 4 };
System.out.println(select(arr, 1, 8, 5));
}
public static int select(int[] arr, int i, int j, int k) {
if (k < 1 || k > j - i + 1) {
return -1;
}
// int t = randomizedPartition(arr, i, j);
int t = randomizedPartition2(arr, i, j);
if (t == i + k - 1) {
return arr[t];
} else if (t < i + k - 1) {
return select(arr, t + 1, j, k + i - 1 - t);
} else {
return select(arr, i, t, k);
}
}
private static int randomizedPartition2(int[] arr, int m, int n) {
int t = new Random().nextInt(n + 1 - m) + m;
int tmp = arr[t];
arr[t] = arr[n];
arr[n] = tmp;
int i = m - 1;
for (int j = m; j < n; ++j) {
if (arr[j] < arr[n]) {
int temp = arr[++i];
arr[i] = arr[j];
arr[j] = temp;
}
}
int temp = arr[i + 1];
arr[i + 1] = arr[n];
arr[n] = temp;
return i + 1;
}
@SuppressWarnings("unused")
private static int randomizedPartition(int[] arr, int m, int n) {
int t = new Random().nextInt(n + 1 - m) + m;
int tmp = arr[m];
arr[m] = arr[t];
arr[t] = tmp;
int key = arr[m];
while (m < n) {
while (m < n && arr[n] >= key) {
--n;
}
arr[m] = arr[n];
while (m < n && arr[m] <= key) {
++m;
}
arr[n] = arr[m];
}
arr[m] = key;
return m;
}
}
分享到:
相关推荐
选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 在Java中,选择排序可以通过一个for循环...
选择排序的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。在这个例子中,外层循环`for(int i=0; i; i++)`用于遍历数组,内层循环`for...
它的基本思想是从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 ...
结合这些知识点,开发者可以创建一个Java程序,首先从文件中读取数据到数组,然后使用选择排序对数组进行排序,最后利用二分查找在排序后的数组中查找特定元素。这是一个典型的文件操作与算法应用的实例。
选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。这种排序方式就像我们在日常生活中挑选东西一样...
选择排序算法的基本思想是,每次选出数组中最小的元素,将其与当前位置的元素交换,直到整个数组排序完成。下面是选择排序算法的详细实现步骤: 1. 首先,定义一个数组a,並将其初始化为5个元素。 2. 然后,使用一...
选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。这种排序方式对于数据量较小或者数据已经部分...
本例中用一个循环语句给a数组各元素送入奇数值,然后用第二个循环语句从大到小输出各个奇数。在第一个 for语句中,表达式3省略了。在下标变量中使用了表达式i++,用以修改循环变量。当然第二个for语句也可以这样作...
2. **选择排序**:选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法...
在编程中,从数组中选出若干个数,使得这些数的和等于一个固定的值,是一个经典的问题,它涉及到组合数学中的“子集求和”问题。这个问题可以使用回溯算法、动态规划等方法来解决。在JavaScript中,我们同样可以使用...
1. 插入排序:插入排序是一种简单的排序算法,它通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。时间复杂度在最坏情况下为O(n²)。 2. 选择排序:选择排序是一种不稳定的排序...
选择排序是一种简单直观的排序算法,它的基本思想是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 首先,我们来看一下选择排序的基本步骤: 1. ...
5. **数据筛选**:筛选数据是指根据某些条件从内存数组中选出满足条件的元素。例如,可以使用“过滤”函数或SQL的“WHERE”子句实现。高效的筛选算法,如线性筛选或二分法筛选,可以减少不必要的遍历操作。 6. **...
而选择排序算法则通过遍历数组,每次从未排序的部分选出最小(或最大)的元素,并将它与未排序序列的第一个元素交换位置。这两种排序算法有各自的优缺点,如冒泡排序算法简单易懂但效率较低,选择排序算法则在某些...
直接插入排序(Insertion Sort):将未排序的元素逐个插入到已排序的数组中,直到全部元素有序。 希尔排序(Shell Sort):插入排序的改进版,通过间隔序列对数组进行分组,分组内部进行插入排序,逐步减小间隔直至...
它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。在VB中,你可以创建一个循环,遍历数组中的每个元素,并与剩余未排序部分的元素进行...
- 外层循环从数组的第一个元素开始,对数组中的每个元素执行一次内层循环。 - 内层循环从当前外层循环的元素开始,直到数组末尾,比较并找出剩余未排序部分中最小(或最大)元素的索引。 - 若找到最小(或最大)...
插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。在实验中,`charu()`函数实现了插入排序。程序首先让用户输入10个待排序的...
它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。Java实现中,主要利用一个for循环遍历数组,每次将未排序的元素插入到已排序部分的正确位置,通过比较来确保...