堆排序讲解(代码简洁)

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

/*算法思想(以大顶堆为例):
      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;
    }
}

总结:理解了就很简单。

原文地址:https://www.cnblogs.com/liuwentao/p/9350089.html

时间: 2024-10-13 16:13:03

堆排序讲解(代码简洁)的相关文章

代码简洁之二:函数只做一件事儿

函数应该做一件事.做好这件事.只做这一件事. 所以我们简化代码的一个简单方式就是不断拆分函数(Extract Method),一直拆分,拆分到不能再分出一个函数为止. 拆函数的过程就是一个概括目的.步骤,提取抽象层次动名词的过程.不要做只是解释代码的简单概括,要让函数中的语句处于一个相同抽象层次,如果是更细节的事儿,请再进一步拆分出一个函数出来.让代码拥有自顶向下的阅读顺序. 以我之前写的一个列表显示的action(MVC框架里面的某个控制器里面的一个方法),最开始代码是这样的: // 接收查询

代码简洁之四 统一抽象层次

我是一个phper,但是也写java,ruby,python,go等代码.最近一直focus on coding in clean,觉得抛开语言的门第之见,从思想上总结如何写更优雅代码的方式和方法,也希望阅读了本文的朋友留言讨论.当然我还是用php做代码演示,不过灵感是来自于<代码简洁之道>的java代码. 首先我要提出一个概念:写代码和写文章是完全一样的事情. 文章可以写得短小精悍,也可写得冗余拖沓.可以写得言简意干.调理清晰,也可被写成云里雾里的天书. 同样的现象也会发生在我们写得代码上.

代码简洁之道——类

(1)类的组织:一般排列顺序公共静态变量.私有静态变量.私有实体变量.公共函数.公共函数调用的私有工具(函数) (2)类应该短小: 单一权责原则:类或模块只有一条加以修改的理由: 内聚:方法操作的变量也多,内聚性就越高: 保持内聚性就会得到许多短小的类 (3)为了修改而组织:对类加以组织,减低修改的风险 隔离修改:借住接口和抽象类来隔离修改细节带来的影响 DIP 依赖导致原则,类应当依赖于抽象而不是依赖于具体细节 代码简洁之道--类

代码简洁之道:C++ 11 之auto+ for_each + lamda表达式

摘要:在很多中情况下,我们需要这样的运算:给vector中每个元素进行相似的处理(每个元素+1,或者其他).一般情况下,我们会选用for循环,然后然后对每个元素进行处理.实际上,C++ 11提供了了lamda表达式,结合for_each,可以写出更加简洁和高效的代码. 1.for_each.简介 for_each是C++中的模板,具体用法可以参考这里:http://www.cplusplus.com/reference/algorithm/for_each/ 2.lamda表达式 lamda表达

堆排序及代码实现

这几天有点抵触情绪,看过了快速排序还有一些别的东西,但是一点都不想写有点复杂的代码0 0拖到了今天终于写了前几天就应该自己写一下的堆排序,完全用C语言写的,下面把代码贴一下.很多地方写得并不好,不过已经经过了测试,可以正确运行. 1 /*堆排序*/ 2 void percolateDown(int* A, int i, int n)//下滤操作 3 { 4 while (i <= ((n - 1) - 1) / 2) 5 { 6 int rc = 2 * i + 2, lc = 2 * i +

知晓设计模式,框架,去提高开发效率,使代码简洁

转自:http://kb.cnblogs.com/page/516088/ http://kb.cnblogs.com/page/516088/ 知晓各种设计模式,框架,技术技巧只是事情的一方面,而知道何时该.何时不该应用他们才是更重要的问题.在不知道一种技巧方式如何能对系统的开发有帮助的情况下,这种模式方法极有可能成为一种开发的阻碍,而不是一种有益的帮助. 好代码是廉价的代码. 但是 … 设计模式毕竟是个好东西 … 不是吗? 当然,但它们好在哪里?它们能提供什么好处? 容易维护 产品更健壮 容

代码简洁之道(1)-年份

1.说明 本文是在阅读一些好的框架的源码时看到的,在此做个记录. 2.具体内容 2.1判断年份是否是闰年 2.1.1前言 为什么会有闰年? 若以陽曆為例,「年」的計算基礎是回歸年,而一個回歸年大約等於365.24220日.因為在平年西曆只計算365日,結果四年後便會累積0.24220×4=0.9688日,大約等於一日,所以便逢四年增加一日閏日以抵銷這0.9688日. 然而,累積4年後多的0.96876天,與真正的1日尚差0.03124天,故如果不間斷地按照4年1閏的方式修正,百年後將累積成365

Delphi中使代码简洁的 5 条忠告(转)

写代码是一种艺术.使用Delphi,任何人都可以轻而易举地开发出某种软件.完成某些任务.而完美的代码则只有真正的高手才能写出.除了正确的缩进.大小写.命名规则之外,请时刻牢记爱因斯坦的名言--简单就是美.下面将谈及的五个代码问题,可能是初学者.甚至一些老鸟都会犯的错误. 忠告一 布尔型变量的赋值操作应该是直接的.例如,在一个if/then/else语句中,if子句将布尔型变量赋值为True,而else子句将其赋为False.下面这段代码的写法是不好的: if If_Love_Delphi the

堆排序【代码】

思路参考<算法导论>P84 堆排序中用到的最重要的就是堆这种数据结构,也正是因为这种数据结构能把时间复杂度控制在O(n * lgn) heapsort算法主要依赖于两个函数 MAX_HEAPIFY(int *A,int i,int len) 用于维护最大堆,时间复杂度为O(lgn),注意书上描述这个函数的算法只用了两个形参,而由于C++无法通过指针获取数组的大小,所以我额外添加了一个参数作为数组的大小 BUILD_MAX_HEAP(int *A,int len) 从无序的输入数据数组中构造一个