数组中第k小的数

原创 2015年07月06日 16:57:32
/**
 * 选取temp=arr[i]作为枢纽,比他小的放他左边,大的放右边,然后判断temp的位置,如果他的位置为k-1,
 * 他就是k小的数;如果他小于k-1,那么k小的数一定在他右边,采用递归在右边继续查找;大则查找左边。
 */
import java.util.Scanner;

public class getKMin {
	public static int quickSort(int[] arr,int low,int high,int k){
		int i,j,temp;
		if(low>high)
			return Integer.MIN_VALUE;
		i=low+1;
		j=high;
		temp=arr[i];
		while(i<j){
			while(i<j&&arr[j]>=temp)
				j--;
			if(i<j)
				arr[i++]=arr[j];
			while(i<j&&arr[i]<temp)
				i++;
			if(i<j)
				arr[j--]=arr[i];
		}
		arr[i]=temp;
		if(i+1==k)
			return temp;
		else if(i+1>k)
			return quickSort(arr, low, i-1, k);
		else
			return quickSort(arr, i+1, high, k);
	}
	public static int getKMin(int[] arr,int k){
		if(arr==null)
			return Integer.MIN_VALUE;
		if(arr.length<k)
			return Integer.MIN_VALUE;
		return quickSort(arr, 0, arr.length-1, k);
	}
	public static void main(String[] args) {
		int arr[]={1,5,2,6,8,0,6};
		Scanner input=new Scanner(System.in);
		int k=input.nextInt();
		System.out.println("第"+k+"小的数为:"+getKMin(arr,k));
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

查找数组中第k大的数

  • 2016-01-08 16:22
  • 669B
  • 下载

线性时间复杂度求数组中第K大数

求数组中第K大的数可以基于快排序思想,步骤如下:       1、随机选择一个支点       2、将比支点大的数,放到数组左边;将比支点小的数放到数组右边;将支点放到中间(属于左部分) ...

求数组中第K大数

问题:有一个大小为n的数组A[0,1,2,…,n-1],求其中第k大的数。 该问题是一个经典的问题,在《算法导论》中被作为单独的一节提出,而且其解决方法很好的利用了分治的思想,将时间复杂度控制在了O...

找出数组中第k大小的数

写一段程序,找出数组中第k大小的数,输出数所在的位置。例如{2,4,3,4,7}中,第一大的数是7,位置在4。第二大、第三大的数都是4,位置在1、3随便输出哪一个均可。比较容易想到的是,找第k大的数:...

寻找数组中第k小的数:平均情况下时间复杂度为O(n)的快速选择算法

又叫线性选择算法,这是一种平均情况下时间复杂度为O(n)的快速选择算法,用到的是快速排序中的第一步,将第一个数作为中枢,使大于它的所有数放到它右边,小于它的所有数放到它左边。下面是具体的算法步骤: 1...

使用二分法从数组中找出最小的k个数

问题:从n个元素的无序数组中,找出最小的k个元素. 分析:可借助快速排序算法的思想,将数组分而治之——随机选取数组中某个元素的值为中值,并以此中值为分水岭,按大小将所有元素分为两组。之后将偏...

电面:给一个数组找出和为k的两个数

如标题所述,其实LeetCode上也有道差不多的题,Two Sum返回这两个数的对应下标。 那我就按LeetCode上那道题来写吧。 先用双指针的方法嘛,不过LeetCode上面是要求返回下标,那...

寻找两个有序数组中的第K个数或者中位数

假设有长度分为为M和N的两个升序数组A和B,在A和B两个数组中查找第K大的数,即将A和B按升序合并后的第K个数。 解法一: 使用两个指针指向A和B的开头,很容易在O(M+N)的时间内完成,此算法略...

剑指offer-求数组中最小的k个数

题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解法1(冒泡排序)冒泡排序每循环一次能够选出一个最小的数,题目要求...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)