寻找第k大数组元素(快速排序思想)

利用快速排序的思想,可以更快在一个无序的数组中找到第k大的数组元素。

1. 算法思想

①首先将数组第一个元素作为基准值,然后分别设置向前和向后的两个指针,将所有小于等于基准值的元素,移动到基准值前;所有大于等于基准值的元素移动到基准值后。调整基准值位置。
②若此时基准值下标是k-1,说明基准值就是第k大的元素;若基准值小于k-1,则说明第k大元素在基准值右边,对基准值右边的元素重复①; 若基准值大于k-1,则说明第k大元素在基准值左边,对基准值左边的元素重复①。

2. 代码实现

import java.util.Arrays;

public class Main {

    /**
     * 寻找数组中第k大元素
     * @param arr
     * @param start
     * @param end
     * @param k
     * @return
     */
    public int quickSort(int[] arr,int start,int end,int k){
        if(start<end){
            int pivot=arr[start];//记录基准值
            int low = start;
            int high = end;
            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;
            if(low==k-1)
                return arr[low];
            else if(low>k-1)
                return quickSort(arr,start,low,k);
            else
                return quickSort(arr,low+1,end,k);
        }
        return -1;//-1代表未能找到第k大的值
    }

    public static void main(String[] args)
    {
        int[] arr=new int[]{4,7,12,6,87,23,10};
        Main main=new Main();
        System.out.println(main.quickSort(arr,0,6,3));
    }
}

如博文有任何错误,欢迎私信作者。

你可能感兴趣的:(算法)