日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

排序算法值--堆排序

發(fā)布時(shí)間:2025/3/12 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 排序算法值--堆排序 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

????????堆實(shí)際上是一棵完全二叉樹,其任何一非葉節(jié)點(diǎn)滿足性質(zhì):

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

? 即任何一非葉節(jié)點(diǎn)的關(guān)鍵字不大于或者不小于其左右孩子節(jié)點(diǎn)的關(guān)鍵字。

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

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

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

具體程序?qū)崿F(xiàn):
public?class?HeapSort {????private?static?void?heapSort(int[] arr) {????????int?len = arr.length -1; ? ?//記得-1????????for(int?i = len/2?-?1; i >=0; i --){?//堆構(gòu)造,將數(shù)組轉(zhuǎn)換為大頂堆????????????heapAdjust(arr,i,len);????????}????????while?(len >=0){????????????swap(arr,0,len--);????//將堆頂元素與尾節(jié)點(diǎn)交換后,長(zhǎng)度減1,尾元素最大????????????heapAdjust(arr,0,len);????//,別忘了這一步,再次對(duì)堆進(jìn)行調(diào)整????????}????}public?static??void?heapAdjust(int[] arr,int?i,int?len){????int?left,right,j ;????while((left =?2*i+1) <= len){????//判斷當(dāng)前父節(jié)點(diǎn)有無左節(jié)點(diǎn)(即有無孩子節(jié)點(diǎn),left為左節(jié)點(diǎn))(注意是左節(jié)點(diǎn),而不是右節(jié)點(diǎn),下面才是右節(jié)點(diǎn))????????right = left +?1;??????????//右節(jié)點(diǎn)????????j = left;???????????????????//j"指針指向左節(jié)點(diǎn)"????????if(j < len && arr[left] < arr[right])????//判斷右節(jié)點(diǎn)是否存在并且是否右節(jié)點(diǎn)大于左節(jié)點(diǎn)????????????j ++;?????//當(dāng)前把"指針"指向右節(jié)點(diǎn)====》下一行的巧妙處理,j不加1,則是與左節(jié)點(diǎn)比較,加一則是與右節(jié)點(diǎn)比較????????if(arr[i] < arr[j])????//將父節(jié)點(diǎn)與孩子節(jié)點(diǎn)交換(如果上面if為真,則arr[j]為右節(jié)點(diǎn),如果為假arr[j]則為左節(jié)點(diǎn))????????????swap(arr,i,j);????????else?????????//說明比孩子節(jié)點(diǎn)都大,直接跳出循環(huán)語句????????????break;????????i = j;????? ? // 子節(jié)點(diǎn)與父節(jié)點(diǎn)交換位置后,要重新進(jìn)行堆調(diào)整,故將j的值賦予i;????}}????public?static??void?swap(int[] arr,int?i,int?len){//交換兩個(gè)數(shù)?????????????int?temp = arr[i];??????????????arr[i] = arr[len];?????????????arr[len] = temp;????}????public?static?void?main(String[] args) {//測(cè)試部分????????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


總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。