算法导论之堆排序
来源:互联网 发布:淘宝女装店哪个好 编辑:程序博客网 时间:2024/04/30 22:32
堆排序主要是先建堆,转化为最大堆,每次把最大的一个(即最大堆的根节点)和最后一个交换,这样每次都把当前最大的一个放到了最后
package sort;
//每次直接改变了数组elements//其实堆就是用数组表示的//从零开始是左孩子是i* 2 + 1,右孩子是i* 2 + 2public class HeapSort {public static void heapSortfunction( int [] elements){ for ( int i = elements.length- 1 ; i > 0 ; i--){ buildHeap(elements,i); //建堆,建完之后是最大堆,也就是根节点是最大的 swap(elements, 0 ,i); //交换根节点和最后一个节点,就是每次把当前最大的放在最后了 }} private static void buildHeap( int [] elements, int lastIndex){//就是把elements【lastindex】变成最大堆 int lastParentIndex = (lastIndex- 1 )/ 2 ; //获得最后一个父节点,以便后面建堆 for ( int i = lastParentIndex; i >= 0 ; i--){ int parent = elements[i]; int leftChild = elements[i* 2 + 1 ]; //左节点肯定存在 int rightChild = leftChild; if (i* 2 + 2 <=lastIndex){//如果最后一个有右节点,就把对应的右节点赋给它 //从零开始是左海子是i* 2 + 1,右孩子是i* 2 + 2 rightChild = elements[i* 2 + 2 ]; //右节点不一定存在 } int maxIndex = leftChild<rightChild?i* 2 + 2 :i* 2 + 1 ;//把leftchild和rightchild中大的index给maxindex //从零开始是左海子是i* 2 + 1,右孩子是i* 2 + 2 if (parent < elements[maxIndex]){//如果parent小于左右孩子中的大的一个,就交换 swap(elements,i,maxIndex); } }} private static void swap( int [] elements, int firstIndex, int secondIndex){ int temp = elements[firstIndex]; elements[firstIndex] = elements[secondIndex]; elements[secondIndex] = temp;} public static void main(String[] args ){int a[]={2,3,1,5,8,9,3};heapSortfunction(a);for(int i=0;i<a.length;i++){System.out.print(a[i]+" ");}}}
0 0
- 【算法导论】之堆排序
- 算法导论之堆排序
- 算法导论之堆排序
- 算法导论笔记之堆排序
- 算法导论笔记之----堆排序
- 【算法导论】第六章之堆排序
- 算法导论 之 堆排序[C语言]
- 算法导论系列文章之堆排序
- 《算法导论》之堆排序学习心得
- 算法导论之五堆排序
- 算法导论之堆排序相关
- 算法导论 堆排序
- 算法导论--堆排序
- 【算法导论】 堆排序
- 算法导论-----堆排序
- 【算法导论】堆排序
- 算法导论-堆排序
- 堆排序--算法导论
- 《大话设计》——行为型模式
- Objective C运行时(runtime)技术的几个要点总结
- ActionBar - API
- 如何拦截Android系统短信
- lamp环境编译出现的相关问题
- 算法导论之堆排序
- 求立方根
- IOCP接收性能测试。瓶颈或者问题?
- 常用的DOS命令
- gitHub常用命令
- Lua模式匹配
- 双色Hanoi塔问题
- uva11988 - Broken Keyboard (a.k.a. Beiju Text) 模拟 链表
- D-PHY