美文网首页
FindK、快排、堆排序

FindK、快排、堆排序

作者: Allenwang | 来源:发表于2018-10-29 18:26 被阅读0次

1、快排解法

public class QuickSort {

    static int partition(int[] a,int left,int right){
        if (left >= right || a == null || a.length <= 1) {
            return;
        }
        int pivot = a[left];
        while (left < right){
            while(a[right] < pivot && left < right){
                right--;
            }

            if(left < right){
                a[left] = a[right];
                left++;
            }

            while(a[left] > pivot && left < right){
                left++;
            }

            if(left < right){
                a[right] = a[left];
                right--;
            }
        }
        a[left] = pivot;
        return left;
    }

    static void quickSort(int[] a,int left,int right){
        if (left >= right) {
            return;
        }
        int pivot = partition(a,left,right);
        quickSort(a,left,pivot-1);
        quickSort(a,pivot+1,right);
    }

    static void quickSortTest(){
        int array[] = {20,50,20,40,70,10,80,30,60};
        System.out.println("排序之前:");
        for(int element : array){
            System.out.print(element+" ");
        }
        System.out.println();
        quickSort(array,0, array.length-1);
        System.out.println("\n排序之后:");
        for(int element : array){
            System.out.print(element+" ");
        }
        System.out.println();
    }


    static int findK(int[] a,int left,int right,int k){
        int pivot = partition(a,left,right);
        if(pivot == k-1){
           return a[pivot];
        }else if(pivot > k-1){
            return findK(a,left,pivot-1,k);
        }else{
            return findK(a,pivot+1,right,k);
        }
    }

    static void findKTest(){
        int array[] = {20,50,20,40,70,10,80,30,60};
        System.out.println(findK(array,0,array.length-1,8));
    }


    public static void main(String[] args){
//        quickSortTest();
        findKTest();
    }

2、堆排解法

public class HeapSort {

    static void swap(int[] a,int i,int j){
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }

    static void maxHeapify(int[] a ,int index,int len){
        int left = (index << 1) + 1; // 左子节点索引
        int right = left + 1;
        int cMax = left;

        if(left > len) return;       // 左子节点索引超出计算范围,直接返回。
        if(right < len && a[left] < a[right]){
            cMax = right;
        }

        if(a[cMax] > a[index]){
            swap(a,index,cMax);
            maxHeapify(a,cMax,len);
        }
    }


    static void heapSort(int[] a){
        int len = a.length -1;
        if(a == null || a.length < 1){
            return;
        }

        int beginIndex = (len - 1) >> 1;

        for (int i = beginIndex ; i >=0 ; i--) {
            maxHeapify(a,i,len);
        }

        while(len >=0){
            swap(a,0,len--);
            maxHeapify(a,0,len);
        }
    }


    static void findK(int[] a,int k){
        int len = a.length -1;
        if(a == null || a.length < 1 || k > len){
            return;
        }

        for (int i = (len/2 -1); i >=0 ; i--) {
            maxHeapify(a,i,len);
        }

        while((k--) > 1){
            swap(a,0,len--);
            maxHeapify(a,0,len);
        }
    }


    static void heapSortTest(){
        int array[] = {20,50,20,40,70,10,80,30,60};
        System.out.println("排序之前:");
        for(int element : array){
            System.out.print(element+" ");
        }
        System.out.println();
        heapSort(array);
        System.out.println("\n排序之后:");
        for(int element : array){
            System.out.print(element+" ");
        }
        System.out.println();
    }

    static void findKTest(){
        int array[] = {20,50,20,40,70,10,80,30,60};
        int k = 3 ;
        findK(array,k);
        System.out.println("K ="+k+"   K NUM ="+array[0]);
    }


    public static void main(String[] args){

        heapSortTest();

        findKTest();

    }
}

相关文章

  • FindK、快排、堆排序

    1、快排解法 2、堆排解法

  • 2019-10-13 快速排序和堆排序

    1.快速排序双边循环发和单边循环法 2.堆排序 3.快排和堆排序的对比(1)快排的堆排序的时间复杂度都是(nlog...

  • 快排 & 堆排序

    排序 排序一直是很基础的一个问题。 复习快排 &堆排序。 LeetCode215 找第k大的元素 快排 注意事项:...

  • php-归并排序、快速排序、堆排序

    归并排序、快速排序、堆排序 时间复杂度 O(nlogn) 归并排序 快速排序(快排) 堆排序

  • 基本排序算法

    冒泡算法 简单选择排序 堆排序 快排 归并排序

  • 快排,堆排序介绍

    快速排序 首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大...

  • 排序

    八大排序算法 一、归并排序 递归及非递归的JAVA实现 二、快速排序 快排算法JAVA实现 三、堆排序 堆排序堆排...

  • 内部排序 - 四种排序总结及比较

    四种排序为 折半插入,希尔排序,快排,堆排序 快排比较重要,前两个学习时候忽略掉了,堆排序以前一直以为比较复杂,现...

  • 7种排序代码总结

    冒泡排序 选择排序 插入排序 希尔排序 归并排序 三路快排 堆排序

  • 数组排序问题(二)

    目录 荷兰国旗问题 随机快排 堆排序 排序算法的稳定性及其汇总 工程中的综合排序算法 比较器的使用 桶排序、计数排...

网友评论

      本文标题:FindK、快排、堆排序

      本文链接:https://www.haomeiwen.com/subject/ofkitqtx.html