zoukankan      html  css  js  c++  java
  • 堆排序讲解(代码简洁)

    本文适用于对堆排序部分理解的同学,主要体现的是代码的简洁.

     /*算法思想(以大顶堆为例)
          1.将长度为n的待排序的数组进行堆有序化构造成一个大顶堆
          2.将根节点与尾节点交换并输出此时的尾节点
          3.将剩余的n -1个节点重新进行堆有序化
          4.重复步骤2,步骤3直至构造成一个有序序列*/

    //堆排序
    public class HeapSort {
        public static void heapSort(int arr[]){
            int size = arr.length;
            //初始化大根堆
            for (int i=0;i<arr.length;i++){
                heapInsert(arr,i);
            }
            swap(arr,0,--size);  //第一个元素和最后一个元素交换。
            while (size>0){      //剩下所有的,依次进行排序,每次确定一个位置。  
                heapify(arr,0,size);
                swap(arr,0,--size);
            }
        }
        //从后向前,确定数据元素的位置。
        public static void heapify(int arr[],int index,int size){
            int left = index*2+1; //设左孩子为left
            while (left<size){
                int largest = left+1<size&&arr[left]<arr[left+1]?left+1:left;  //左孩子和右孩子判断,取大的
                largest = arr[index]>arr[largest]?index:largest;  //左右之中大的和父节点比较
                if (largest==index){   //如果父节点大,就说明原位置不变,此时返回即可。
                    return;
                }
                swap(arr,largest,index);
                index = largest;
                left = index*2+1;  //层层判断
            }

        }
        // 每插入一个元素,从新建立大根堆,用于初始化用。
        public static void heapInsert(int arr[],int index){

            while (arr[index]>arr[(index-1)/2]){
                swap(arr,index,(index-1)/2);
                index = (index-1)/2;
            }
        }
        // 设置一个交换。
        public static void swap(int arr[],int p,int q){
            int temp = arr[p];
            arr[p] = arr[q];
            arr[q] = temp;
        }
    }

    总结:理解了就很简单。

  • 相关阅读:
    IBM实习
    软件测试——一些想法
    ftp文件上传下载实用命令
    Json解析,Json-lib
    eclipse Swt编程—窗口小部件widget
    Java 泛型
    我的理想与现实
    Java泛型介绍——HashMap总结
    Java语言面向对象的一些基本特点
    Java的一些常见问题,JRE,JDK,JVM,包等概念理解
  • 原文地址:https://www.cnblogs.com/liuwentao/p/9350089.html
Copyright © 2011-2022 走看看