排序算法之堆排序

前言

接着上篇文章–数据结构之堆,学习下堆排序。其实了解堆的构建与删除的方法之后,应该很容易的想到堆排序的思想。

先初始化一个堆,将一个无序的待排的数组中的每一个值依次放入堆中,也就是上文提到的insert(),接下来一直执行删除操作,也就是上文提到的delete(),并且将被删除的元素放到数组的最后一个有效元素之后的一个位置,保存下来,最后的数组就是一个有序的数列了。

实现代码

    /**
     * 堆排序
     */
    public void sort() {
        //首先需要初始化元素
        if (isEmpty()) {
            throw new RuntimeException("先给点初始化数据才可以排序!");
        }
        //依次删除元素,放入数组的最后
        int size = element[0];
        for (int i = 0; i < size ; i++) {
            int deleteElement = delete();
            element[element[0] + 1] = deleteElement;
        }
        //输出排序后的元素
        for (int i = 1; i < size + 1 ; i++) {
            System.out.print(element[i]);
            if (i != size) {
                System.out.print(",");
            }
        }
    }

测试与运行结果

public class HeapSortTest {
    public static void main(String[] args) {
        MyHeap heap = new MyHeap(100);
        int[] arr = {9,18,34,15,29,66,12,48};
        //依次添加数据
        for (int i = 0; i < arr.length ; i++) {
            heap.insert(arr[i]);
        }
        //排序并输出排序后的元素
        heap.sort();
    }
}

这里写图片描述

性能分析

堆排序的性能是O(nlogn),性能非常的好。

但是需要注意的是,由于堆需要把所有的数据建堆,所以如果数据量较少,则建堆的操作势必有些浪费,所以堆排序很适合在对大量的数据进行排序时使用。

猜你喜欢

转载自blog.csdn.net/qq_33764491/article/details/79810026