前言
接着上篇文章–数据结构之堆,学习下堆排序。其实了解堆的构建与删除的方法之后,应该很容易的想到堆排序的思想。
先初始化一个堆,将一个无序的待排的数组中的每一个值依次放入堆中,也就是上文提到的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),性能非常的好。
但是需要注意的是,由于堆需要把所有的数据建堆,所以如果数据量较少,则建堆的操作势必有些浪费,所以堆排序很适合在对大量的数据进行排序时使用。