堆排序算法
来源:互联网 发布:淘宝舞帝商城 编辑:程序博客网 时间:2024/06/07 16:43
package sort;/** * HeapSort * 堆排序算法: * 基本思想:利用堆积树(堆)这种资料结构所设计的一种排序算法, 可以利用数组的特点快速定位指定索引的元素。 * 堆排序是不稳定的排序方法,辅助空间为O(1), 最坏时间复杂度为O(nlog2n) , 堆排序的堆序的平均性能较接近于最坏性能。 * * 大根堆排序算法的基本操作: * ① 初始化操作:将R[1..n]构造为初始堆; * ②每一趟排序的基本操作:将当前无序区的堆顶记录R[1]和该区间的最后一个记录交换,然后将新的无序区调整为堆(亦称重建堆)。 * ①只需做n-1趟排序,选出较大的n-1个关键字即可以使得文件递增有序。 * ②用小根堆排序与利用大根堆类似,只不过其排序结果是递减有序的。堆排序和直接选择排序相反 * :在任何时刻堆排序中无序区总是在有序区之前,且有序区是在原向量的尾部由后往前逐步扩大至整个向量为止。 * */public class HeapSort{ private int countStep = 0; public void sort(int[] initData) { int len = initData.length; heap_sort(initData, len-1); } public void heap_sort(int[] arrays, int end) { if (end > 0) { init_sort(arrays, end);// 初始化堆,找出最大的放在堆顶,即放在0的位置 arrays[0] = arrays[end] + arrays[0]; arrays[end] = arrays[0] - arrays[end]; arrays[0] = arrays[0] - arrays[end]; heap_sort(arrays, end - 1); } } public void init_sort(int[] arrays, int end) { int m = (end + 1) / 2; for (int i = 0; i < m; i++) { boolean flag = build_heap(arrays, end, i); //如果有根与孩子交换就要重新从顶根开始查找不满足最大堆树结构 if(flag) { i=-1; } } } public boolean build_heap(int arrays[], int end, int i) { int l_child = 2 * i + 1;// 左孩子 int r_child = 2 * i + 2;// 右孩子 countStep ++; if (r_child > end) { // 判断是否有右孩子,没有的话直接比较,小于交换 if (arrays[i] < arrays[l_child]) { arrays[i] = arrays[i] + arrays[l_child]; arrays[l_child] = arrays[i] - arrays[l_child]; arrays[i] = arrays[i] - arrays[l_child]; return true; } else { return false; } } // 在根与两个孩子之间找出最大的那个值进行交换 if (arrays[i] < arrays[l_child]) { if (arrays[l_child] > arrays[r_child]) { // 交换根与左孩子的值 arrays[i] = arrays[i] + arrays[l_child]; arrays[l_child] = arrays[i] - arrays[l_child]; arrays[i] = arrays[i] - arrays[l_child]; return true; } else { // 交换根与右孩子的值 arrays[i] = arrays[i] + arrays[r_child]; arrays[r_child] = arrays[i] - arrays[r_child]; arrays[i] = arrays[i] - arrays[r_child]; return true; } } else if (arrays[i] < arrays[r_child]) { // 交换根与右孩子的值 arrays[i] = arrays[i] + arrays[r_child]; arrays[r_child] = arrays[i] - arrays[r_child]; arrays[i] = arrays[i] - arrays[r_child]; return true; } return false; } public int showStep() { return countStep; }}
0 0
- 排序算法--堆排序
- 排序算法-堆排序
- 排序算法---堆排序
- 【排序算法】堆排序
- 排序算法-堆排序
- 排序算法---堆排序
- 排序算法--堆排序
- 排序算法----堆排序
- 排序算法--堆排序
- 排序算法 堆排序
- 排序算法-堆排序
- 排序算法:堆排序
- 排序算法---堆排序
- 【排序算法】堆排序
- 排序算法:堆排序
- 排序算法-堆排序
- 排序算法:堆排序
- 排序算法-堆排序
- SAS DM数据准备读书笔记(目录)
- C#屏幕截图类
- 五个你必须知道的javascript和web debug技术
- 快速排序算法
- 【km笔记】java之面向对象(01)
- 堆排序算法
- 桶式排序算法
- poj 1251 Jungle Roads 最小生成树
- PHP在不同页面间传递Json数据示例代码
- 希尔排序及其优化
- Cocos2D-x游戏开发之十五:CCTMXTiledMap地图的基础实例
- 关于筛法
- postgres 必须知道的命令
- MathDemo