`
Flyingh
  • 浏览: 18376 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

选出数组中从i到j的第k小的元素(不用对数组排序)

阅读更多
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快速,选择,冒泡数组排序

    选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 在Java中,选择排序可以通过一个for循环...

    冒泡排序 算法(冒泡,选择,插入,数组排序)

    选择排序的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。在这个例子中,外层循环`for(int i=0; i; i++)`用于遍历数组,内层循环`for...

    对一个数组进行选择排序

    它的基本思想是从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 ...

    文件读出数组进行选择排序和二分查找(java)

    结合这些知识点,开发者可以创建一个Java程序,首先从文件中读取数据到数组,然后使用选择排序对数组进行排序,最后利用二分查找在排序后的数组中查找特定元素。这是一个典型的文件操作与算法应用的实例。

    java选择排序 数组选择排序

    选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。这种排序方式就像我们在日常生活中挑选东西一样...

    C语言程序设计-程序举例选择排序.pptx

    选择排序算法的基本思想是,每次选出数组中最小的元素,将其与当前位置的元素交换,直到整个数组排序完成。下面是选择排序算法的详细实现步骤: 1. 首先,定义一个数组a,並将其初始化为5个元素。 2. 然后,使用一...

    java对数组实现选择排序(csdn)————程序.pdf

    选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。这种排序方式对于数据量较小或者数据已经部分...

    C语言程序设计标准教程

     本例中用一个循环语句给a数组各元素送入奇数值,然后用第二个循环语句从大到小输出各个奇数。在第一个 for语句中,表达式3省略了。在下标变量中使用了表达式i++,用以修改循环变量。当然第二个for语句也可以这样作...

    java类实现数组的冒泡选择插入希尔等五种排序扫描.pdf

    2. **选择排序**:选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法...

    JavaScript实现从数组中选出和等于固定值的n个数

    在编程中,从数组中选出若干个数,使得这些数的和等于一个固定的值,是一个经典的问题,它涉及到组合数学中的“子集求和”问题。这个问题可以使用回溯算法、动态规划等方法来解决。在JavaScript中,我们同样可以使用...

    插入排序、选择排序、希尔排序、堆排序、冒泡、双向冒泡、快速排序、归并排序、递归的归并排序、基数排序

    1. 插入排序:插入排序是一种简单的排序算法,它通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。时间复杂度在最坏情况下为O(n²)。 2. 选择排序:选择排序是一种不稳定的排序...

    Java使用选择排序法对数组排序实现代码

    选择排序是一种简单直观的排序算法,它的基本思想是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 首先,我们来看一下选择排序的基本步骤: 1. ...

    内存结构数组数据管理

    5. **数据筛选**:筛选数据是指根据某些条件从内存数组中选出满足条件的元素。例如,可以使用“过滤”函数或SQL的“WHERE”子句实现。高效的筛选算法,如线性筛选或二分法筛选,可以减少不必要的遍历操作。 6. **...

    “C语言程序设计”课程数组教学方法的探索.pdf

    而选择排序算法则通过遍历数组,每次从未排序的部分选出最小(或最大)的元素,并将它与未排序序列的第一个元素交换位置。这两种排序算法有各自的优缺点,如冒泡排序算法简单易懂但效率较低,选择排序算法则在某些...

    C语言归并、选择、直接插入、希尔、冒泡、快速、堆排序与顺序、二分查找排序.rar

    直接插入排序(Insertion Sort):将未排序的元素逐个插入到已排序的数组中,直到全部元素有序。 希尔排序(Shell Sort):插入排序的改进版,通过间隔序列对数组进行分组,分组内部进行插入排序,逐步减小间隔直至...

    VB 各种排序法

    它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。在VB中,你可以创建一个循环,遍历数组中的每个元素,并与剩余未排序部分的元素进行...

    php选择排序法实现数组排序实例分析

    - 外层循环从数组的第一个元素开始,对数组中的每个元素执行一次内层循环。 - 内层循环从当前外层循环的元素开始,直到数组末尾,比较并找出剩余未排序部分中最小(或最大)元素的索引。 - 若找到最小(或最大)...

    数据结构排序实验报告.pdf

    插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。在实验中,`charu()`函数实现了插入排序。程序首先让用户输入10个待排序的...

    常用排序算法实现(java)

    它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。Java实现中,主要利用一个for循环遍历数组,每次将未排序的元素插入到已排序部分的正确位置,通过比较来确保...

Global site tag (gtag.js) - Google Analytics