《算法导论》学习心得(四)—— 堆排序(Java)
2014-11-08 09:23
477 查看
堆排序是一种很常见的排序方法,它的思想是利用数据结构--堆。具体的实现细节:
1. 构建一个最大堆。对于给定的包含有n个元素的数组A
,构建一个最大堆(最大堆的特性是,某个节点的值最多和其父节点的值一样大。这样,堆中的最大元素存放在根节点中;并且,在以某一个节点为根的子树中,各节点的值都不大于该子树根节点的值)。从最底下的子树开始,调整这个堆结构,使其满足最大堆的特性。当为了满足最大堆特性时,堆结构发生变化,此时递归调整对应的子树。
2. 堆排序算法,每次取出该最大堆的根节点(因为根节点是最大的),同时,取最末尾的叶子节点来作为根节点,从此根节点开始调整堆,使其满足最大堆的特性。
3. 重复上一步操作,直到堆的大小由n个元素降到2个。如图所示http://upload.wikimedia.org/wikipedia/commons/4/4d/Heapsort-example.gif
1. 构建一个最大堆。对于给定的包含有n个元素的数组A
,构建一个最大堆(最大堆的特性是,某个节点的值最多和其父节点的值一样大。这样,堆中的最大元素存放在根节点中;并且,在以某一个节点为根的子树中,各节点的值都不大于该子树根节点的值)。从最底下的子树开始,调整这个堆结构,使其满足最大堆的特性。当为了满足最大堆特性时,堆结构发生变化,此时递归调整对应的子树。
2. 堆排序算法,每次取出该最大堆的根节点(因为根节点是最大的),同时,取最末尾的叶子节点来作为根节点,从此根节点开始调整堆,使其满足最大堆的特性。
3. 重复上一步操作,直到堆的大小由n个元素降到2个。如图所示http://upload.wikimedia.org/wikipedia/commons/4/4d/Heapsort-example.gif
<pre name="code" class="java">package com.tangbo; import java.util.Random; import java.util.Scanner; public class HeapSort { static Scanner scanner; static Random random = new Random(); public static void main(String[] args) { print(heapSort(buidMaxHeap(productArray())));//生成数组,建堆,堆排序,打印 } static void print(int []array)//打印函数 { for(int i=0;i<array.length;i++) { System.out.print(array[i]+" "); } System.out.println(); } static int [] productArray()//生成一个数组 { int arrayayLength=0; System.out.println("请输入数组长度:"); scanner = new Scanner(System.in); arrayayLength = scanner.nextInt(); int [] arrayayTemp = new int[arrayayLength]; for (int i = 0; i < arrayayLength; i++) { arrayayTemp[i]=random.nextInt(1000); } return arrayayTemp; } static int[] heapSort(int [] array)//堆排序 { int tempValue=0; int arrayLength = array.length; for(int i=arrayLength-1;i>=0;i--) { tempValue = array[i]; array[i] = array[0]; array[0] = tempValue; maxHeapify(array,0,i); } return array; } static int [] buidMaxHeap(int [] array)//健最大堆 { int arrayLength = array.length; for(int i=array.length/2-1;i>=0;i--) { maxHeapify(array, i,arrayLength); } return array; } static int [] maxHeapify(int [] array,int i,int heapSize)//堆维护 { int leftIndex,rightIndex,largest,tempValue; leftIndex = 2*i+1; rightIndex = 2*i+2; if(leftIndex<heapSize && array[leftIndex]>array[i]) { largest = leftIndex; }else { largest = i; } if(rightIndex<heapSize && array[rightIndex]>array[largest]) { largest = rightIndex; } if(largest!=i) { tempValue = array[largest];//交换 array[largest] = array[i]; array[i] = tempValue; maxHeapify(array, largest,heapSize);//维护下一个 } return array; } }
相关文章推荐
- 《算法导论》学习心得(三)—— 归并排序(Java)
- 《算法导论》学习心得(十一)—— 队列(JAVA)
- 《算法导论》学习心得(六)—— 计数排序(Java)
- 《算法导论》之堆排序学习心得
- 《算法导论》学习心得(八)—— 桶排序(JAVA)
- 《算法导论》学习心得(五)—— 快排(Java)
- 《算法导论》学习心得(九)——栈(JAVA)
- 《算法导论》学习心得(十)—— 泛型(JAVA)
- Java异常学习心得
- Java容器类学习心得
- java学习心得
- java学习心得体会
- 终于在csdn上安家了!这个博客将作为我学习java历程,记录我心得的一个地方
- JAVA学习心得--运算符、表达式与语句
- JAVA 学习心得_备忘而已!
- JAVA学习心得--继承、接口与泛型
- JAVA学习心得--线程
- JAVA学习心得--基础知识
- think in java3学习心得之——Reusing class
- 学习java心得体会(一)