算法—堆排序—Java实现
来源:互联网 发布:淘宝天下小二怎么联系 编辑:程序博客网 时间:2024/05/18 03:00
转载请注明出处:http://blog.csdn.net/ljmingcom304/article/details/50379605
本文出自:【梁敬明的博客】
1.堆排序
堆排序就是将序列调整为指定的堆,然后调整首尾元素的位置,取出末尾元素,反复进行,直到将所有元素取出,形成一个有序的序列。假设存在n个元素的序列
存在一个序列【7】【5】【9】【6】【8】,按照从小到大的顺序进行排序。
①将无序序列构造成一个堆。
②取出子节点中6和8较大的值,与父节点5进行比较,比父节点5大,则交换位置。
③取出子节点中8和9较大的值,与根节点7进行比较,比跟节点7大,则交换位置,此时序列已调整为大根堆。
④将节点9和5调换位置,同时取出节点9,然后按照相同的方式将序列转换为大根堆,取出序列中最大的数,重复操作直到序列中所有数取出完毕,生成一个新的有序序列。
2.示例代码
存在一个序列N由小到大进行排序,将序列转换为大根堆,交换首尾元素的位置,再将子序列N-1转换为大根堆,交换收尾元素位置,反复进行,当子序列剩余一个元素时,此时的序列为一个有序序列。
public class HeapSort { public static void main(String[] args) { int[] array = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; HeapSort.sort(array); System.out.println("排序后数组:" + Arrays.toString(array)); } public static void sort(int[] a) { // 循环建立初始堆,若父节点索引为i,那么左节点的索引为i*2+1,即左节点为a.length时,其父节点应当小于a.length/2 for (int i = a.length / 2; i >= 0; i--) {// 遍历存在子节点的父节点 adjustHeap(a, i, a.length - 1); } // 进行n-1次循环完成排序 for (int i = a.length - 1; i > 0; i--) { // 最后一个元素和第一个元素进行交换 int temp = a[i]; a[i] = a[0]; a[0] = temp; adjustHeap(a, 0, i); } } // 将数组转换为大根堆,大根堆的根节点为数组中的最大值 public static void adjustHeap(int[] a, int parent, int length) { int temp = a[parent]; // 父节点的值 int child = 2 * parent + 1; // 左子节点的索引 while (child < length) {// 判断左节点是否为最大索引 // 如果有右孩子结点,并且右孩子结点的值大于左孩子结点,则选取右孩子结点 if (child + 1 < length && a[child] < a[child + 1]) { child ++;// 将左子节点转换为右子节点 } // 当父节点的值直接大于子节点的值时,直接退出 if (temp > a[child]) break; // 将子节点的值赋值给父节点 a[parent] = a[child]; // 选取子节点的左子节点继续向下筛选 parent = child; child = 2 * parent + 1; } // 若发生交换,此时parent代表子节点索引,没有发生交换,此时parent仍旧代表父节点索引 a[parent] = temp; }}
3.算法分析
时间复杂度:堆排序的时间复杂度为
算法稳定性:排序前后相同元素间的相对位置可能会发生改变,堆排序是一种不稳定的排序算法。
0 0
- 堆排序算法——Java实现
- 算法—堆排序—Java实现
- Java实现排序算法——堆排序
- 堆排序算法-java实现
- Java实现堆排序算法
- Java实现堆排序算法
- 堆排序算法java实现
- 堆排序算法--Java实现
- 堆排序算法java实现
- Java排序算法——堆排序
- 排序算法之Java实现2——堆排序算法
- Java实现排序算法之堆排序
- java实现排序算法之堆排序
- Java实现排序算法2:堆排序
- java实现简单排序算法:堆排序
- 排序算法之堆排序java实现
- 排序算法之堆排序 Java 实现
- 排序算法Java实现——选择排序(堆排序)
- Android listview 嵌套 editText ,editText 设置setOnFocusChangeListener,带来重复调用的问题。
- 生产者-消费者模型
- spring-依赖注入 配置文件
- 在使用开源library的PullToRefreshView中,页面初始化时自动触发下拉刷新
- 关于sessionStorage和localhostStorage(内容为网上摘抄,自学用)
- 算法—堆排序—Java实现
- 优先级倒置(Priority inversion)
- "无法找到“ .exe”的调试信息,或者调试信息不匹配。未使用调试信息生成二进制文件"
- 在C语言中调用shell命令的实现方法
- linux下内存的统计和内存泄露类问题的定位
- bzoj1202: [HNOI2005]狡猾的商人
- 反射
- 京东-Java开发工程师-一面
- ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password :Y)