ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

堆排序

2022-04-05 22:32:38  阅读:173  来源: 互联网

标签:index arr 最大数 int 堆排序 heapSize left


1.堆排序的基本思想:

*用堆排序实现升序
* 其主要用到了大根堆的思想(先理解大根堆的思想,再进行堆排序)
*
* 因为大根堆可以快速找到最大数,所以只要每次都把这个最大数和最后一个数交换,那么依次进行:
* 就可以使得最大数被换到最后一个,倒二大的数换到倒二个,直到heapSize缩到0为止,则全部换完,完成排序

 

2.实现代码及解析:

 1 public static void HeapSort(int[] arr) 
 2     {
 3         if (arr == null || arr.length == 1) {
 4             return;
 5         }
 6         for (int i = 0; i < arr.length; i++) {
 7             HeapInsert(arr,i);//先将其调整为大根堆的形式
 8         }
 9         int heapSize = arr.length;
10         //接下来开始逐步取出这些元素
11         swap(arr,0,--heapSize);//因为arr[0]肯定是最大数,将其换到最后一个(注意是前--)
12         while (heapSize > 0) {
13             Heapify(arr,0,heapSize);//因为把某个小数换到第一个了,要进行大根堆的向下调整
14             swap(arr,0,--heapSize);//把最大数换到当前子数组的最后一个
15         }
16     }
17     
18     public static void HeapInsert(int[] arr,int index) 
19     {
20         while (arr[index] > arr[(index - 1) / 2]) {
21             swap(arr,index,(index - 1) / 2);
22             index = (index - 1) / 2;
23         }
24     }
25     
26     public static void Heapify(int[] arr,int index,int heapSize)
27     {
28         int left = 2 * index + 1;
29         while (left < heapSize) {
30             int largest = left;
31             if (left + 1 < heapSize && arr[left] < arr[left + 1]) {
32                 largest = left + 1;
33             }
34             if (arr[largest] <= arr[index])
35             {
36                 largest = index;
37             }
38             if (largest == index) {
39                 break;
40             }
41             swap(arr,largest,index);
42             index = largest;
43             left = 2 * index + 1;
44         }
45     }
46     
47     public static void swap(int[] arr,int a,int b) 
48     {
49         if (a != b) {
50             arr[a] = arr[a] ^ arr[b];
51             arr[b] = arr[a] ^ arr[b];
52             arr[a] = arr[a] ^ arr[b];
53         }
54     }

 

标签:index,arr,最大数,int,堆排序,heapSize,left
来源: https://www.cnblogs.com/jue1e0/p/16104303.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有