각개 컨커 방법 배열 찾을인가를 K 번째로 큰 원소

문제의 확장 토론 :

문제 해결 프로그램 (시간 복잡도, 공간 복잡도 대비) 토론은 TopK https://blog.csdn.net/BigBug_500/article/details/102558183을

    public static void main(String[] args) {
        
        //采用分治法找到数组中第k 大 的元素
        int k = 3;
        int[] arr = new int[]{4, 3, 6, 9, 3, 2, 8, 0};
        quickSortfindNumberK(arr, 0, arr.length - 1, k);
        System.out.println(Arrays.toString(arr));
        System.out.println("第" + k + "大的元素为:" + arr[k]);
    }

 //////////////////分治法 找到第k大的元素
    private static void quickSortfindNumberK(int[] arr, int start, int end, int k) {
        if (start >= end) {
            return;
        }
        int divideIndex = divideDesc(arr, start, end);


        //相比于降序排序,找到第k大的元素加上这一步可以减少操作步骤,去掉这一步便可完成降序排序
        if (divideIndex == k) {
            return;
        }

        //分治法,按divideIndex将数组分成两部分达到分治的效果
        quickSortfindNumberK(arr, start, divideIndex - 1, k);
        quickSortfindNumberK(arr, divideIndex + 1, end, k);
    }

    //该方法将数组交换为降序数组,与升序数组的交换仅有  1、2处不同
    //返回数组中的索引,将其划分为两部分
    private static int divideDesc(int[] arr, int start, int end) {
        //将开始位置作为坑,坑有divideIndex的属性
        int pivot = arr[start];
        int divideIndex = start;
        //一轮比较的结束标志
        while (start <= end) {
            //循环从后向前比较指定值。如果小于指定值,end--;如果大于指定值,end位置值填入坑,并作为新坑,旧坑位置比较完成(start++),跳出
            while (start <= end) {
                if (arr[end] > pivot) {//1. 与升序的算法相反
                    divideIndex = end;
                    arr[start] = arr[end];
                    start++;
                    break;
                }
                end--;
            }
            //循环从前往后比较指定值,如果大于指定值,start++;如果小于指定值,start位置值填入坑,并作为新坑,旧坑位置比较完成(end--),跳出
            while (start <= end) {
                if (arr[start] < pivot) {//2. 与升序的算法相反
                    divideIndex = start;
                    arr[end] = arr[start];
                    end--;
                    break;
                }
                start++;
            }
        }
        //!!将开始取出的中心点赋值到数组的中心位置
        arr[divideIndex] = pivot;
        return divideIndex;
    }

    //////////////////end 分治法 找到第k大的元素

더 배열 k 번째로 큰 원소를 찾는 방법에 대한 : https://mp.weixin.qq.com/s/LKrxeFT9S5NEAHlhHI3nSQ

빠른 정렬 참조에 대한 분할 및 정복 방법 : https://blog.csdn.net/BigBug_500/article/details/90899713

게시 91 개 원래 기사 · 원의 찬양 (54) ·은 10000 +를 볼

추천

출처blog.csdn.net/BigBug_500/article/details/98105061