- 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));
}
}