zoukankan      html  css  js  c++  java
  • 堆排序

    堆排序的时间复杂度是:o(nlogn); 

    第一种思路:在所有的循环中,循环的第一次是建堆,剩余的是调整堆。

    public class lianxi {
        public static void main(String[] args){
            int[] array = {1,2,3,4,5,6,7,8};
            int[] result = new lianxi().heapSort(array);
            System.out.println(Arrays.toString(array));
        }
        public int[] heapSort(int[] array){
            int length = array.length;
            for(int i=0;i<length;i++){
                buildHeap(array,length-1-i);
                //System.out.println(Arrays.toString(array));
                swap(array,0,length-1-i);
                //System.out.println(Arrays.toString(array));
            }
            return array;
        }
        public void buildHeap(int[] array,int n){
            int i=0;                // 保证后面的几次循环只是调整堆,调整一次堆的时间复杂度是O(logn),需要调整n次,所以需要的时间复杂度是O(nlogn);
            if(n==array.length-1) i = (n-1)/2;  //保证当第一次循环时,只是建堆,建堆需要的时间复杂度是O(nlogn);
            for(;i>=0;i--){            //由以上两个注释,可以得到最后的时间复杂度是o(nlogn)。                                                      
                int m = i;
                while(2*m+1<=n){
                    int p = 2*m+1;
                    if(p<n){
                        if(array[p]<array[p+1]){
                            p = p+1;
                        }
                    }
                    if(array[m]<array[p]){
                        swap(array,m,p);
                        m = p;
                    }else{
                        break;
                    }
                }
            }
        }
        public void swap(int[] array,int p,int q){
            int temp = array[q];
            array[q] = array[p];
            array[p] = temp;
        }
    }

    第二种思路是:先建堆,然后再调整堆。(建立一个调整堆函数

    public int[] heapSort(int[] array){
            int length = array.length;
            for(int i=(length-2/2);i>=0;i--){
                adjustHeap(array,i,length-1);
            }
            for(int i=0;i<array.length;i++){
                swap(array,0,length-1-i);
                adjustHeap(array,0,length-2-i);
            }
            return array;
        }
        public void adjustHeap(int[] array,int m,int n){ //m:代表开始的调整堆的节点,n:代表需要调整的堆的大小。
            while(2*m+1<=n){
                int p = 2*m+1;
                if(p<n){
                    if(array[p]<array[p+1]){
                        p=p+1;
                    }
                }
                if(array[m]<array[p]){
                    swap(array,m,p);
                    m = p;
                }else{
                    break;
                }
                
            }
        }
            public void swap(int[] array,int p,int q){
            int temp = array[q];
            array[q] = array[p];
            array[p] = temp;
        }
    }
        

  • 相关阅读:
    猜数字游戏,猜三次都不对,则结束游戏,猜一次就成功,结束游戏
    用return关键字实现1——100累加求和,返回总和并接收输出
    用return关键字实现求和操作
    return关键字的作用和接受实验
    数组各元素随机赋值、求和、求平均值、求最大值的各类测试(一维数组)
    日期下拉选择
    22--
    css 17课--
    css盒模型
    css学习
  • 原文地址:https://www.cnblogs.com/yingpu/p/5813175.html
Copyright © 2011-2022 走看看