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

  • 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));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值