美文网首页
Android 算法之排序算法(堆排序)

Android 算法之排序算法(堆排序)

作者: Kevin_小飞象 | 来源:发表于2021-08-02 09:01 被阅读0次

堆排序

堆排序(Heap Sort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

算法描述

  • 将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;
  • 将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];
  • 由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。

动图演示

05.gif

实例

  1. 代码实现
public class HeapTest {
    public static void main(String[] args) {
        int[] sort ={3,2,1,4,6,5,8,9,10,7} ;
        System.out.println("排序前:");
        printArray(sort);
        heapSort(sort);
        System.out.println("\n排序后:");
        printArray(sort);
    }
    
    public static void printArray(int[] array) {
        System.out.print("{");
        int len=array.length;
        for (int i = 0; i < len; i++) {
            System.out.print(array[i]);
            if (i < len - 1) {
                System.out.print(", ");
            }
        }
        System.out.println("}");
    }
    
    public static void heapSort(int[] a){
       int len = a.length;
       for (int i = 0;i < len ;i++) {
           sink(a,len-1-i);
           exch(a,0,len-1-i);
           
       } 
       

    }
    
    /**
    * 创建堆算法
    */
    public static void sink(int[] a,int lastIndex) {
        for(int i = (lastIndex-1)/2;i >= 0;i--) {
            int k = i;
            while(2 * k + 1 <= lastIndex) {
                int bigIndex = 2*k+1;
                if(bigIndex < lastIndex) {
                    if(a[bigIndex] < a[bigIndex + 1]) {
                        bigIndex++;
                    }
                }
                
                if(a[k] < a[bigIndex]) {
                    exch(a,k,bigIndex);
                    k = bigIndex;
                }else {
                    break;
                }
            }
        }
    }
    
    /**
    * 交换两元素
    */
    public static void exch(int[] a,int i,int j) {
        if(i == j) {
            return;
        }
        a[i] = a[i] + a[j];
        a[j] = a[i] - a[j];
        a[i] = a[i] - a[j];
        
    }
}
  1. 输出结果


    02.png

相关文章

  • iOS算法总结-堆排序

    iOS算法总结-堆排序 iOS算法总结-堆排序

  • 堆排序

    转载:图解排序算法(三)之堆排序 预备知识 堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选...

  • 数据结构与算法

    常见排序算法 堆排序 算法大全 算法大汇总

  • 3.11 堆的概念及堆排序思路

    Chapter3: 更好的查找与排序算法 11. 堆的概念及堆排序 [1] 图解排序算法(三)之堆排序 讲得很好,...

  • web开发需要知道的几个算法

    算法分类 快速排序算法 深度优先算法 广度优先算法 堆排序算法 归并排序算法

  • 排序算法-堆排序

    参考: Java排序算法(五):堆排序 【算法与数据结构】图说堆排序 【数据结构】排序算法:希尔、归并、快速、堆排...

  • 2018-06-30

    排序算法之堆排序 堆排序是利用堆的数据结构而设计的一种排序算法,堆排序是一种选择排序。可以利用数组的特点快速定位制...

  • Android 算法之排序算法(堆排序)

    堆排序 堆排序(Heap Sort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并...

  • 3.2-选择排序-堆排序

    参考链接 选择排序:堆排序(Heap Sort) 白话经典算法系列之七 堆与堆排序 堆排序与快速排序,归并排序一样...

  • 堆排序算法思想

    前两天看了看堆排序算法,啃了半天的书,最后搞明白了堆排序算法,今天有时间给大家说说这个堆排序算法。首先讲一下算法的...

网友评论

      本文标题:Android 算法之排序算法(堆排序)

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