排序算法总结之堆排序 - hapjin

2018-08-09 08:52

一,堆排序引见

堆是先队列。,为了大堆,桩顶单元最大分量。将 要排序的队列 建堆,继不竭使死亡堆顶部元素,一种排序应验了。。对堆,参考书:资料结构--堆的造成之深化辨析

上面的堆排序算法将队列打中元素从小到大排序,应用大堆造成。

二,堆排序算法辨析

现时作出一维队列。,您必要用堆对队列打中元素停止排序。。率先,使被安排好堆,您可以在倘若的一维队列上成立堆。。 N元素 肉体美堆的工夫错综复杂的状态为O(n)

造成堆排序的详细一项有两种办法。:一种办法是移除堆顶部元素。,把它放在第一附带队列中,继堆被修长的成第一新堆。。接下来,持续使死亡堆顶部元素,直到堆打中各式各样的的元素都堆起来为止,排序是在这个时候应验的。。这种办法必要额定的附带空的O(n)。

另类的方法是:将每个已使死亡的顶部堆栈元素获名次在队列的末了。。由于,堆的根本买卖 delMin/delMax 像(Delmin是用于小的顶部堆),DELMAX是筹码大的顶部堆,应用同样的的原理来交换物堆打中极限的第一元素。,继每况愈下堆堆修长的。从此,此特点可用于保在完毕时使死亡的每个顶部元素。,当各式各样的的元素都不在意的堆中时,队列是按由大到小排列的。这种方法不必要额定的附带空的。,空的错综复杂的状态为O(1)

三,堆排序算法造成

 1publicclass HeapSort {
 2 3publicstatic extends Comparablesuper T>> void 堆排序(t) ARR)
 4//build heap 5for(int i = /2 - 1; i >= 0; i--)
 6            percDown(arr, i, );
 7 8 9for(int i =  - 1; i >= 0; i--)
10        {
11             swapReference(arr, 0, i);//delete Max1213             percDown(arr, 0, i);// 从根部修长的到脚步14        }
15    }
1617privatestatic extends Comparablesuper T>> void swapReference(T[] arr, int from, int 到)
18        T tmp;
19         tmp = ARR[是人]
20         ARR[是人] = ARR[到]
21         ARR[到] = tmp;
22    }
2324//求解 i 善用左手25privatestaticint leftChild(int i){
26return 2*i + 1;
27    }
2829/**30     * 
31     * @param arr 内存堆的一维队列
32     * @param i 从 i 地势开端每况愈下修长的。
33     * @param n 堆打中元素数(变动从而产生断层队列的大小)
34*/35privatestatic extends Comparablesuper T>> void percDown(T[] arr, int i, int n){
36int child;
37        T TMP;/ /有效提出结节停止修长的,当你找到侵吞的地方的,你必要把它放在右方的的地方的,拿堆定货单
3839for(TMP) = ARR[I]  leftChild(i) < n; i = 幼雏)
40        {
41             child = leftChild(i);
42if(幼雏) != n-1 && ARR [幼雏] < 0)
43                 child++;//侵吞的孩子更大44if(抗透明质酸酶反应[子] < 0)
45                 ARR[I] = 抗透明质酸酶反应[幼雏]//父结节每况愈下蒙混46else47break;//当父结节大于左、右子结节时,你不必要再停止48        }
49         ARR[I] = tmp;//把结节放在右方的的地位50    }
5152//for test purpose53publicstaticvoid 主(串) ARGS) {
54         Integer[] arr = {31,41,59,26,53,58,97};
55        堆排序(ARR)
56for (概数 i : ARR) {
57             System.out.print(i + " ");
58        }
59    }
60 }

有数个一项必要解说。:

在第三行堆排序法中,第5-6行是堆买卖,由于队列打中元素是从下标0内存的。,因而极限的的非叶结节是下标。:/2 - 1

第9—14行是堆排序的买卖。。SavaRooRoad办法相当于使死亡堆顶部元素。,由于它将顶部元素交换物到队列的末了。,此刻,顶部元素不再是最高值(大堆)。。使死亡堆顶部元素后,要停止堆修长的拿堆定货单,曲折法 应验堆的下载功用。

在桩的修长的处理中,必要处理结节的右边 右子结节的地位。故有第一leftChild办法用来求解左孩子的地位(当心元素是从队列下标0开端内存的)

④percDown办法造成每况愈下的堆修长的功用。第三十七行 tmp 变量 有效要修长的的提出结节,当你找到侵吞的地方的,你必要把它放在右方的的地方的,拿堆定货单。肉体美堆,要修长的的结节是人 非叶结节 开端,直到根结节。用于使死亡堆顶部元素,它不断地从顶部元素修长的(要修长的的结节是R)。

大约的第三第十九条线充分巧妙。,率先tmp有效要修长的的提出结节 ARR[I],继断定 ARR[I] 有缺勤延期的孩子,即使有第一善用左手,又在第42行的if宣判中断定它即使除此之外右孩子(幼雏) != N-1),继对孩子和孩子停止对比地。,孩子以极大的力记载孩子。。

IF宣判在44-45行打中功能是:对比地第一孩子和第一大的体重和双亲,即使父结节的权很小,则必要将哪个较大的孩子上移到父浬的地位(也相当于父浬下移到孩子的地位)

即使父结节的权较大,找到了侵吞的地方的。。它表白,不必要更多的修长的。,表现如此等等 break;

第四的第十九行,要修长的的结节转变成有关性的地位i。整个处理不应用Exchange买卖。,它应用评价买卖隐式地造成E的功用。,这是第一优化组合。

四,堆排序算法错综复杂的状态辨析

N元素肉体美堆的工夫错综复杂的状态为O(n),使死亡堆顶部元素的工夫错综复杂的状态为O(Logn)。,虽有元素不竭使死亡,堆的调整越来越小。,但概括地说,使死亡堆各式各样的的元素的工夫错综复杂的状态为O(NlogN)

堆排序的工夫错综复杂的状态为O(nLogn)。,空的错综复杂的状态为O(1)

实则,堆排序是第一充分波动的算法。,最坏的和秤锤的工夫错综复杂的状态是O(nLogn)

另外,堆排序,资料的初始秩序对其不同类缺勤星力。。队列声母是按次还是以相反由大到小排列。,它将率先成立堆,堆定货单的财产。

五,参考书资料

排序算法的拔出排序

排序算法的感觉最敏锐的地方排序

排序算法的归拢排序

各式各样的排序算法综述

分享到:
收藏