日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

排序算法值--堆排序

發布時間:2025/3/12 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 排序算法值--堆排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

????????堆實際上是一棵完全二叉樹,其任何一非葉節點滿足性質:

? Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2]

? 即任何一非葉節點的關鍵字不大于或者不小于其左右孩子節點的關鍵字。

? ????????堆分為大頂堆和小頂堆:

? ? ?????????????? 大頂堆????????????????????????????????????????????????????????????????????????????????小頂堆

算法思想(以大頂堆為例): 1.將長度為n的待排序的數組進行堆有序化構造成一個大頂堆(將數組--》轉化為一個大頂堆) ? 2.將根節點與尾節點交換并輸出此時的尾節點(交換節點) ? 3.將剩余的n -1個節點重新進行堆有序化(交換節點后繼續有序化) ? 4.重復步驟2,步驟3直至構造成一個有序序列(重復2,3步驟) ? 假設待排序數組為[20,50,10,30,70,20,80]

具體程序實現:
public?class?HeapSort {????private?static?void?heapSort(int[] arr) {????????int?len = arr.length -1; ? ?//記得-1????????for(int?i = len/2?-?1; i >=0; i --){?//堆構造,將數組轉換為大頂堆????????????heapAdjust(arr,i,len);????????}????????while?(len >=0){????????????swap(arr,0,len--);????//將堆頂元素與尾節點交換后,長度減1,尾元素最大????????????heapAdjust(arr,0,len);????//,別忘了這一步,再次對堆進行調整????????}????}public?static??void?heapAdjust(int[] arr,int?i,int?len){????int?left,right,j ;????while((left =?2*i+1) <= len){????//判斷當前父節點有無左節點(即有無孩子節點,left為左節點)(注意是左節點,而不是右節點,下面才是右節點)????????right = left +?1;??????????//右節點????????j = left;???????????????????//j"指針指向左節點"????????if(j < len && arr[left] < arr[right])????//判斷右節點是否存在并且是否右節點大于左節點????????????j ++;?????//當前把"指針"指向右節點====》下一行的巧妙處理,j不加1,則是與左節點比較,加一則是與右節點比較????????if(arr[i] < arr[j])????//將父節點與孩子節點交換(如果上面if為真,則arr[j]為右節點,如果為假arr[j]則為左節點)????????????swap(arr,i,j);????????else?????????//說明比孩子節點都大,直接跳出循環語句????????????break;????????i = j;????? ? // 子節點與父節點交換位置后,要重新進行堆調整,故將j的值賦予i;????}}????public?static??void?swap(int[] arr,int?i,int?len){//交換兩個數?????????????int?temp = arr[i];??????????????arr[i] = arr[len];?????????????arr[len] = temp;????}????public?static?void?main(String[] args) {//測試部分????????int?array[] = {20,50,20,40,70,10,80,30,60};????????System.out.println("排序之前:");????????for(int?element : array){????????????System.out.print(element+" ");????????}????????heapSort(array);????????System.out.println("\n排序之后:");????????for(int?element : array){????????????System.out.print(element+" ");????????}????}}

看完不懂可參考https://www.cnblogs.com/MOBIN/p/5374217.html


總結

以上是生活随笔為你收集整理的排序算法值--堆排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。