数据结构(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();
    }

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

数据结构与算法--查找与排序(一)

Top 线性查找二分查找冒泡排序插入排序选择排序快速排序归并排序 1 线性查找 1.1 问题 线性查找,又称为顺序查找,是指在所有给定的值中从一端开始逐个检查每个元素是否为要查...
  • opera95
  • opera95
  • 2016年04月22日 08:30
  • 2815

数据结构实验:查找和排序

查找和排序 实验目的   1. 掌握顺序查找,二分法查找,分块查找的算法。   2.掌握各种排序算法及其性能的比较 二、实验内容 1.编写一个程序输出在顺序表{13,22,35,43,54,...
  • u012278856
  • u012278856
  • 2014年06月03日 22:12
  • 697

Java实现动态表查找--二叉排序树

定义 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:  (1)若左子树不空,则左子树上所有结点的键值均小于或等于它的根结点的键值;  (2)若右子树不空,则右子树上所有结点的键值均大于或等于它...
  • u011514810
  • u011514810
  • 2017年03月04日 15:01
  • 368

数据结构——排序查找算法实现

前面转载了一篇讲排序算法的文章,这几天将排序和查找算法进行了实现,在这里贴出代码来。...
  • u010757264
  • u010757264
  • 2016年08月18日 16:13
  • 467

java中排序与查找

java中排序和二分查找
  • wwyl1001
  • wwyl1001
  • 2016年01月26日 11:00
  • 301

Java数据结构----树--二叉查找(搜索或排序)树BST

二叉查找树(Binary Search Tree),是基于二叉树,具有下列性质: 1、若左子树不空,则其左子树上的所有结点的值均小于根结点的值; 2、若右子树不空,则其右子树上的所有结点的值均大于根结...
  • oChangWen
  • oChangWen
  • 2016年02月26日 17:50
  • 899

[Java]各种基础的查找和排序算法总结

查找方法: 1.顺序查找。 按数组的顺序从前往后一直比较,直到找到目标值返回。 优点:对数组的结构没有特定的要求,算法简单。 缺点:当数组个数n较大时,效率低下。 时间复杂度:最大时间复杂度是O(n)...
  • qq284565035
  • qq284565035
  • 2014年12月02日 16:30
  • 1835

数据结构C语言版之查找(折半选择快速等)

//查找: #include #include #include typedef struct{ int *elem; int length; }SStable; typedef struct ...
  • qq_26816591
  • qq_26816591
  • 2015年12月24日 12:35
  • 643

数据结构中排序和查找的算法

(一)排序算法     排序算法是一种基本并且常用的算法。由于实际工作中要处理的数据量巨大,所以对排序算法有很高的速度要求。而一般我们所谓的算法的性能主要是指算法的复杂度,一般用O方法来表示。O方法的...
  • carefree31441
  • carefree31441
  • 2008年09月13日 03:35
  • 3775

Java排序与查找

参考博客地址 http://blog.csdn.net/pzhtpf/article/details/7560294
  • googlevsbing
  • googlevsbing
  • 2016年02月26日 10:41
  • 485
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构(Java)——查找和排序(5)
举报原因:
原因补充:

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