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;
        }
    }

    总结:理解了就很简单。

  • 相关阅读:
    5.2基础标签学习
    6.15ajax选房子
    6.15ajax写数据库的增删改查
    [Ext JS 4] 实战之Grid, Tree Gird 添加按钮列
    DOM4J 读取XML配置文件进行数据库连接
    Bit Map解析
    图像像素操作
    九度OJ 1025 最大报销额(01背包)
    MYSQL :逗号分隔串表,分解成竖表
    interrupt & storage & DMA
  • 原文地址:https://www.cnblogs.com/liuwentao/p/9350089.html
Copyright © 2011-2022 走看看