您的位置:首页 > 其它

无序数组找出其中的第K大的数

2017-09-23 11:46 267 查看
python

# -*- coding: utf-8 -*-
"""
Created on Sat Sep 23 10:19:24 2017

@author: MLee
"""

import random

def partition(arr, low, high):
pivot = arr[low]
while low < high:
while low < high and arr[high] <= pivot:
high -= 1
arr[low] = arr[high]
while low < high and arr[low] >= pivot:
low += 1
arr[high] = arr[low]
arr[low] = pivot
return low

def get_Kth_max(arr, low, high, k):
pos = partition(arr, low, high)
if (pos+1) == k:
return arr[k-1]
elif (pos+1) < k: # k始终为数组中的绝对位置
return get_Kth_max(arr, pos+1, high, k)
else:
return get_Kth_max(arr, low, pos-1, k)

if __name__ == "__main__":
k = int(input("(total: 10)> "))
sample = random.choices(range(-50, 50), k=10)
print(sample)
print(sorted(sample, reverse=True))
print(get_Kth_max(sample, 0, len(sample)-1, k))


补充:

# -*- coding: utf-8 -*-
"""
Created on Sat Sep 23 10:45:21 2017

@author: MLee
"""

def get_Kth_max(arr, k):
arr = sorted(arr, reverse=True)
count = 1
index = 0
for i in range(1, len(arr)):
if count == k:
break
if arr[i] != arr[index]:
index = i
count += 1
return arr[index]

if __name__ == "__main__":
k = int(input("> "))
arr = list(map(int, input("> ").split()))
print(sorted(arr, reverse=True))
print(get_Kth_max(arr, k))


java

package edu.ccnu;

import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class Kth {

public static int partition(int[] arr, int low, int high){
int pivot = arr[low];
while(low < high){
while(low < high && arr[high] <= pivot){
high--;
}
arr[low] = arr[high];
while(low < high && arr[low] >= pivot){
low++;
}
arr[high] = arr[low];
}
arr[low] = pivot;
return low;
}

public static int getKthMax(int[] arr, int low, int high, int k){
int pos = partition(arr, low, high);
if((pos+1) == k){
return arr[k-1];
}else if((pos+1) < k){
return getKthMax(arr, pos+1, high, k);
}else{
return getKthMax(arr, low, pos-1, k);
}
}

public static void main(String[] args) {
Random rand = new Random(System.currentTimeMillis());
int[] sample = new int[8];
//      int k = rand.nextInt(sample.length);
Scanner sc = new Scanner(System.in);
System.out.print("> ");
int k = sc.nextInt();
for(int i = 0; i < sample.length; i++){
sample[i] = rand.nextInt(100);
}
System.out.println(Arrays.toString(sample));
System.out.println(getKthMax(sample, 0, sample.length-1, k));
Arrays.sort(sample);
System.out.println(Arrays.toString(sample));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  第k大数 数组
相关文章推荐