美文网首页
2018-09-19 树形选择排序

2018-09-19 树形选择排序

作者: MiaLing007 | 来源:发表于2018-09-19 23:16 被阅读0次

一,树形选择排序思想

树形选择排序是模拟锦标赛而发明的一种排序方法,又可以称为锦标赛排序。
下边以一个具体例子来说明整个排序过程


2.png

下边java代码实现:
用数组来存储二叉树.

import java.util.Arrays;

public class TreeSelectSort {

    /**
     * 树形选择排序
     */
    public static void treeSelectSort(Object[] a) {
        int len = a.length;
        int treeSize = 2 * len - 1; // 完全二叉树的节点数
        int ai = 0; // 待排序数组a的元素索引指针。
        Object[] tree = new Object[treeSize]; // 临时的树存储空间
        
        // 由后向前填充此树, 索引从0开始
        for (int i = len-1, j=0; i >= 0; --i,j++) { //填充最后一层叶子节点
            tree[treeSize-1-j] = a[i];
        }
        
        for (int i = treeSize-1; i > 0; i-=2) { // 填充非叶子节点(比较叶子节点大小,然后填入到父节点)
            tree[(i-1)/2] = ((Comparable)tree[i-1]).compareTo(tree[i]) < 0 ? tree[i-1] : tree[i];
        }
        
        // 不断移走最小节点
        int minIndex;
        while (ai < len) {
            Object min = tree[0];   // 最小值
            a[ai++] = min;
            minIndex = treeSize - 1;
            // 找到最小值的索引
            while (((Comparable)tree[minIndex]).compareTo(min) != 0) {
                minIndex--;
            }
            // 将最小值设置为最大(设置为Integer.MAX_VALUE)
            tree[minIndex] = Integer.MAX_VALUE; //设置一个最大值标志
            // 找到其兄弟节点
            while (minIndex > 0) {  // 如果其还有父节点
                if (minIndex % 2 == 0) { //如果为右节点,跟其左节点作比较,取最小值
                    tree[(minIndex-1)/2] = ((Comparable)tree[minIndex]).compareTo(tree[minIndex-1]) > 0 ? tree[minIndex-1] : tree[minIndex];
                    minIndex = (minIndex - 1) / 2; //设置为父节点的索引,继续向上比对
                } else {    //如果为做节点
                    tree[minIndex/2] = ((Comparable)tree[minIndex]).compareTo(tree[minIndex+1]) > 0 ? tree[minIndex+1] : tree[minIndex];
                    minIndex = minIndex / 2; // 设置为父节点的索引,继续向上比对
                }
            }
        }
    }
    
    public static void main(String[] args) {
        Integer[] data = {49,38,65,94,76,13,27,48,63,90};
        treeSelectSort(data);
        System.out.println(Arrays.toString(data));
    }
}

相关文章

  • 2018-09-19 树形选择排序

    一,树形选择排序思想 树形选择排序是模拟锦标赛而发明的一种排序方法,又可以称为锦标赛排序。下边以一个具体例子来说明...

  • 06.选择类排序法(树形选择排序,堆排序)

    06.选择类排序法(树形选择排序,堆排序) 参考网页:https://mparticle.uc.cn/articl...

  • iOS - 堆排序

    Demo_github 堆排序 堆排序(Heap Sort)是一种树形选择排序,是对直接选择排序的有效改进。 堆的...

  • 2018-04-19 堆排序java

    上一遍中,学习了树形选择排序,https://www.jianshu.com/p/b20ed599ac07树形选择...

  • 交换排序--快速排序

    2018-09-19 交换排序--快速排序 思路:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟排...

  • 选择排序之堆排序

    堆排序是简单选择排序的一种 是一种树形选择排序方法 排序特点、排序思想:在排序过程中,将L[1...n]视为一棵【...

  • 树形选择排序-锦标赛排序

  • 堆排序(二叉树)

    (1)基本思想:堆排序是一种树形选择排序,是对直接选择排序的有效改进。 堆的定义如下:具有n个元素的序列(h1,h...

  • 选择排序:堆排序(Heap Sort)

    堆排序是一种树形选择排序,是对直接选择排序的有效改进。 基本思想: 堆顶元素(即第一个元素)必为最小项(小顶堆)或...

  • 排序算法(1):堆排序

    图解堆排序 摘要: 堆排序是一种树形选择排序,在排序过程中可以把元素看成是一颗完全二叉树,每个节点都大(小)于它的...

网友评论

      本文标题:2018-09-19 树形选择排序

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