zoukankan      html  css  js  c++  java
  • 堆排序Java实现

    看了很多博主写了堆排序的原理,都讲解的挺明白,就是代码实现(主要是java语言)有些让人眼花缭乱。我重新整理了堆排序的代码实现(java)。

    有哪些问题和不妥之处,还希望伙伴们提醒,我及时改正。感谢!!

    堆排序讲解:https://blog.csdn.net/qq_21492635/article/details/73105580

          https://blog.csdn.net/u010429424/article/details/77582627

    总结点:

    (1)堆排序不稳定。

    (2)得到递增序列用大顶堆,得到递减序列用小顶堆。

    (3)排序时间复杂的O(nlog2n),辅助空间O(1)。

    (4)初始建堆O(n)

     1 public class HeapTest {
     2 
     3     public static void main(String[] args) {
     4         int [] array = {1,19,3,24,26,4,78,14,27,10,177,6,22,17,22,53};
     5          heapSort(array);
     6          for (int i = 0; i < array.length; i++) {
     7             System.out.print(array[i]+ " ");
     8         }
     9     }
    10 
    11     /**
    12      * 堆排序
    13      * @param array
    14      */
    15     private static void heapSort(int[] array) {
    16         // TODO Auto-generated method stub
    17         //考虑边界情况
    18         if (array.length <= 1) {
    19             return;
    20         }
    21         //构建初始堆
    22         for (int i = (array.length / 2) - 1; i >= 0; i--){
    23             adjustHeap(array,i,array.length - 1);
    24         }
    25         //将堆顶元素置换到待排序数组的最后一个,对新长度的数组进行堆调整
    26         for (int k = array.length - 1; k >= 0; k--){
    27             int tmp = array[k];
    28             array[k] = array[0];
    29             array[0] = tmp;
    30             //此处adjustHeap中k代表待排序的数组长度,不是数组下标
    31             adjustHeap(array, 0, k - 1);
    32         }
    33     }
    34 
    35     /**
    36      * 构建堆
    37      * start为待调整数组的开始元素的下表,end为待调整数组最后一个元素的下标
    38      * @param array
    39      * @param i
    40      * @param length
    41      */
    42     private static void adjustHeap(int[] array, int start, int end) {
    43         // TODO Auto-generated method stub
    44         
    45         int temp,j;
    46         //temp存储start处的值
    47         temp = array[start];
    48         //用j记录start左孩子的下标: j = 2 * start + 1
    49         for (j = 2 * start + 1;j <= end; j = j * 2 + 1){
    50             //如果start有右孩子,且右孩子比左孩子大,j++,获得右孩子下标
    51             if (j + 1 <= end && array[j] < array[j + 1]) {
    52                 j++;
    53             }
    54             //判断当temp在现在位置(当前的start位置),是不是比他的孩子都大,如果是,调整完毕跳出调整循环;如果不是,当前孩子的值赋给当前start位置
    55             if (temp >= array[j]) {
    56                 break;
    57             }
    58             array[start] = array[j];
    59             //存temp值可以被赋值的节点的下标
    60             start = j;
    61         }
    62         //将temp赋值到当前的start位置
    63         array[start] = temp;
    64     }
    65 }
  • 相关阅读:
    *关于如何获取指定表的指定字段的数据类型的方法
    *检查表是否存在
    *用Sql添加删除字段,判断字段是否存在的方法
    *MSSQL三个关键系统表
    *系统表的应用
    VC++ ADO编程入门简介
    int i=0; i=i++ System.out.Println(i)
    Microsoft Visual C++ 6.0 关联源代码
    VC ADO接口详解
    程序员每年该做的事
  • 原文地址:https://www.cnblogs.com/wtting/p/8862084.html
Copyright © 2011-2022 走看看