堆排序
2017-11-17 10:43
274 查看
package dataStructures.sort; /* * 堆排序过程:首选建大顶堆,然后将堆顶与堆得最后一个元素交换位置;由于交换后堆基本有序,只有堆顶元素位置不正确,因此需要从堆顶往下调整堆, * 调整好后,将堆顶元素与倒数第二个元素互换位置,依次类推 * 排序过程中设计两个核心步骤:初始化建堆(从[n/2]元素开始,即最后一个非叶子节点,循环调整堆的过程);交换堆顶与堆中最后一个元素后,调整堆 * */ public class HeapSort { public static void main(String[] args) { // TODO Auto-generated method stub int[] a = {49,38,65,97,76,13,27}; sort(a); } //初始化堆,即建堆 private static void intHeap(int[] a) { // TODO Auto-generated method stub int n = a.length; for(int i=n/2-1; i>=0; i--){ HeapAdjust(a, i, n); } printAllNum(a); } /* * 已知a[i…m]除了a[i] 外均满足堆的定义 * 调整a[s],使其成为大顶堆.即将对第s个结点为根的子树筛选, * * @param a是待调整的堆数组 * @param i是待调整的数组元素的位置 * @param length是待调整数组的长度 */ private static void HeapAdjust(int[] a, int i, int length){ int left = 2*i+1; /*int right = 2*(i+1); if(left < length && a[i] < a[left]){ swap(a, i, left); HeapAdjust(a,left,length); } if(right < length && a[i] < a[right]){ swap(a, i, right); HeapAdjust(a,right,length); }*/ while(left < length){ if(left+1 < length && a[left] < a[left+1]){ left++; } if(a[i] >= a[left]){ break; }else{ swap(a, i, left); i=left; left = 2*i+1; } } } private static void swap(int[] a, int s, int m){ int t = a[s]; a[s] = a[m]; a[m] = t; } private static void sort(int[] a) { intHeap(a); for(int j=a.length-1; j>0; j--){ //将堆顶元素与堆中最后一个元素交换 swap(a, 0, j); printAllNum(a); HeapAdjust(a, 0, j); } } private static void printAllNum(int[] a) { for(int i=0; i<a.length; i++) { System.out.print(a[i] + " "); } System.out.println(); } }
相关文章推荐
- 堆排序
- 算法导论 之 堆排序[C语言]
- Sort-堆排序
- 选择排序——堆排序
- 堆排序
- 使用堆排序对一组随机数进行排序
- 数据结构-堆排序
- 经典排序算法 - 堆排序Heap sort
- 算法导论6.4-4 所有元素均不相同时,最好情况下,堆排序复杂度为Ω(nlgn)
- 冒泡排序,快速排序,归并排序,选择排序,插入排序,堆排序
- python算法--堆排序详细实现
- 堆的构建与堆排序
- 排序算法总结4-堆排序
- 【算法导论】堆排序
- 关于堆排序建堆时间以及堆排序的分析之暑假学习记录
- heapsort堆排序(3种语言实现 c/java/python)
- 排序之堆排序
- 排序算法c语言描述---堆排序
- 算法导论6:堆排序
- 排序算法之堆排序(二)