排序算法值--堆排序
生活随笔
收集整理的這篇文章主要介紹了
排序算法值--堆排序
小編覺得挺不錯(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GitBlit使用安装教程~
- 下一篇: Web应用安全————Shiro 解决会