求数列中第K大的数

原创


利用到快速排序的思想,快速排序思想:https://www.cnblogs.com/chiweiming/p/9188984.html

array代表存放数列的数组,K代表第K大的数,mid代表一趟快速排序后返回的基准记录下标;

一趟快速排序下来若基准记录存在的位置满足:array.length-mid==K,则说明array[mid]即是第

K大的数,若小于K,说明第K大的数在区间 [ left , mid-1 ],大于K说明在区间 [ mid+1,right ];

import java.util.*;

public class 算法分析与设计2_3_选做 {
    
    static int array[];
    static int K;
    static int mid;
    
    static int yiSort(int left,int right) {    //一趟快速排序
        int x=array[left];    //存储基准记录
        while(left<right) {
            while(left<right && array[right]>=x) {
                right--;
            }
            if(left<right) {
                array[left]=array[right];
                left++;
            }
            while(left<right && array[left]<x) {
                left++;
            }
            if(left<right) {
                array[right]=array[left];
                right--;
            }
        }
        array[left]=x;//基准记录归位
        return left;
    }
    
    static void fun(int left,int right) {
        mid=yiSort(left,right);
        if(array.length-mid==K) {
            return;
        }
        if(array.length-mid<K) {
            fun(left,mid-1);
        }else {
            fun(mid+1,right);
        }
    }
    
    public static void main(String[] args) {
        Scanner reader=new Scanner(System.in);
        System.out.print("求数组中第K大的数:");
        K=reader.nextInt();
        System.out.print("输入数组大小(数组大小>=K):");
        int n=reader.nextInt();
        array=new int[n];
        System.out.print("输入数组元素:");
        for(int i=0;i<n;i++) {
            array[i]=reader.nextInt();
        }
        fun(0,n-1);
        System.out.println(array[mid]);
    }

}

16:31:24

2018-10-06

原文地址:https://www.cnblogs.com/chiweiming/p/9747667.html