欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

堆排序-Java实现

程序员文章站 2022-04-14 21:45:29
复习排序算法时,自己写了一个堆排序的Java实现,重点是容易理解。 Talk is cheap,直接上代码; ......

复习排序算法时,自己写了一个堆排序的Java实现,重点是容易理解。

Talk is cheap,直接上代码;

 1 /**
 2  * Created by hardaway on 2018/7/20.
 3  * 堆排序(heap)
 4  * 本代码用大顶堆实现
 5  * 1.构建大顶堆. 2.取走堆顶元素,更新大顶堆,直到堆空;
 6  * 时间复杂度O(NlgN),最好,最坏,平均时间复杂度都是O(NlgN)
 7  * 不稳定排序
 8  */
 9 public class HeapSort {
10     public void sort(int[] arr){
11         construct(arr);   //构建大顶堆
12         for(int i = 0; i<arr.length-1; i++){
13             swap(arr, 0, arr.length-1-i);  //取走堆顶元素,即将最大的元素与当前未排序序列中的末尾元素交换位置;
14             restructure(arr,0, arr.length-1-i); //重构大顶堆
15         }
16     }
17     public void construct(int[] arr){  //构建大顶堆,很重要的一点是,arr.length/2-1这个位置的元素是最后一个有子节点的元素;
18         for(int i = arr.length/2-1; i>=0; i--){
19             restructure(arr, i, arr.length);
20         }
21     }
22     public void restructure(int[] arr, int index, int arrLength){
23         if(index>arrLength/2-1)
24             return;
25         int temp = 2*index+1;
26         if(((2*index+2)<arrLength)&&(arr[2*index+1]<arr[2*index+2]))
27             temp = 2*index+2;
28         if(arr[index]<arr[temp])
29             swap(arr, index, temp);
30         else
31             return;
32         restructure(arr, temp, arrLength); //递归构建,保证它的子节点也是大顶堆
33     }
34     public void swap(int[] arr, int i, int j){ //交互位置,没什么好说的
35         int temp = arr[i];
36         arr[i] = arr[j];
37         arr[j] =temp;
38     }
39     public static void main(String[] args) { //测试用例
40         int[] arr = {9,3,1,4,2,7,8,6,5};
41         System.out.println(Arrays.toString(arr));
42         HeapSort m = new HeapSort();
43         m.sort(arr);
44         System.out.println(Arrays.toString(arr));
45     }
46 }