数据结构(Java)——查找和排序(5)

原创 2015年11月21日 15:52:24

低头要有勇气,抬头要有底气。

堆排序的增加理解:
由于前面对于堆排序有些疑问存在,因此今天我再一次研究了一下堆排序的算法和设计思想。

1.构建大根堆的算法设计

根据二叉树的性质我们可以得非叶节点最大序号值为size/2 。
因此我们根据一个数据构建大根堆的算法就是:
【1】首先将当前的数组作为一个完全二叉树保存
【2】从最后一个非叶节点进行构建大顶堆
【3】循环 -》 利用判定和递归进行构建大顶堆

2.堆排序的算法思路使用白话的方式来描述就是

1)构建一个大根堆;
2)将根节点0和最后一个结点n-1兑换;
3)交换后调整构建大根堆;
4)n=n-1;如果n!=0 重复执行 2)——3)
5)结束 说明排序完成 可以直接输出。

3. 堆排序的Demo程序实现(Java)

package ds.java.ch09;

/**
 * @author LbZhang
 * @version 创建时间:2015年11月21日 下午3:15:34
 * @description 类说明
 */
public class MyHeapSort {
    public static int[] Data = { 5, 4, 6, 3, 9, 7, 0, 1, 2, 8 };

    public static void main(String[] args) {
        printArray(Data);
        heapSort(Data);

    }

    private static void heapSort(int[] data) {
        // 第一步调整大根堆
        int len = data.length;
        for (int i = len / 2; i >= 0; i--) {
            heapAdjust(i, data, len);
        }
        printArray(data);

        for (int i = len-1; i >= 0; i--) {
            int temp = data[i];
            data[i] = data[0];
            data[0] = temp; 
            heapAdjust(0, data, i);// 重新调整堆顶节点成为大顶堆
        }
        printArray(data);


    }

    private static void heapAdjust(int root, int[] data, int size) {

        int left = 2 * root;
        int right = 2 * root + 1;
        int max = root;

        if (root < size / 2) {
            if (left < size && data[left] > data[max]) {
                max = left;
            }

            if (right < size && data[right] > data[max]) {
                max = right;
            }

            if (max != root) {
                int temp = data[root];
                data[root] = data[max];
                data[max] = temp;
                // 避免调整之后以max为父节点的子树不是堆
                heapAdjust(max, data, size);
            }

        }

    }

    private static void printArray(int[] data) {
        for (int i = 0; i < Data.length; i++) {
            System.out.print(data[i] + " - ");
        }
        System.out.println();
    }

}
版权声明:本文为博主原创文章,未经博主允许不得转载。

数据结构与算法分析(Java语言描述)(5)—— 归并排序

伪代码split each element into partitions of size 1 recursively merge adjancent partitions for i = lef...

数据结构(Java)——查找和排序(1)

查找是这样一个过程,即在某个项目组中寻找某一指定目标元素,或者确定该组中并不存在该目标元素。 对其进行查找的项目的组有时也成为查找池。 两种常见的查找方式:线性查找和二分查找。 为了能够查找某...

数据结构(Java)——查找和排序(4)

基数排序 堆排序 希尔排序

数据结构(Java)——查找和排序(2)

基础的排序算法Java实现。

数据结构——排序查找等实验

  • 2010年11月19日 17:12
  • 2.29MB
  • 下载

数据结构——5 单链表排序

单链表排序:基于冒泡法,每个节点不动,只动结点里面的x。

Java数据结构与算法之数组排序——冒泡

冒泡排序很简单,根据图形来记算法,非常容易。
  • a80C51
  • a80C51
  • 2015年09月29日 23:14
  • 396

数据结构与算法——插入排序(Java实现)

/**  * 插入排序的思想好比对手中的扑克牌排序;  * 好比左手为空,桌面牌面朝下,我们每次拿  * 起一张桌面的牌,将其插入左手正确的位置,  * 在插入过程中,将被插入的牌按某一顺序逐个  *...

数据结构与算法分析(Java语言描述)(7)—— 快速排序

伪代码for each (unsorted) partition set first element as pivot storeIndex = pivotIndex + 1 for i = ...

数据结构与算法分析(Java语言描述)(13)—— 原地堆排序

package com.algorithm.sort;public class HeapSortInPlace { private HeapSortInPlace() { } p...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构(Java)——查找和排序(5)
举报原因:
原因补充:

(最多只允许输入30个字)