看了左神的堆排序,覺得思路很清晰,比常見的遞迴的堆排序要更容易理解,所以自己整理了一下筆記,帶大家一步步實現堆排序演算法
首先介紹什麼是大根堆:每乙個子樹的最大值都是子樹的頭結點,即根結點是所有結點的最大值
堆排序是基於陣列和二叉樹思想實現的(二叉樹是腦補結構,實際是陣列)
堆排序過程
1、陣列建成大根堆,首先,遍歷所有結點,當前結點index和父結點(index-1)/ 2 比較 (當前陣列的下標是index,此結點的父結點的下標就是(index-1)/ 2 ),如果比父結點大,交換,變成父結點的位置再和上一層的父結點比較,直到滿足大根堆條件
int swap(int source, int a, int2、讓根結點和最後乙個結點交換位置,也就是陣列的第乙個數和最後乙個數交換位置,接下來最後乙個數不用考慮了,比如乙個陣列有5個數,定義乙個變數size=5,大根堆的根結點放到最後乙個數後,--sizeb)int heapsort(int source, int
len)
}int heapinsert(int source, int
index)
}
int size =len;3、讓交換後的頭結點經歷乙個向下的調整,讓結點和自己的兩個孩子比較,如果孩子的值比頭結點大,交換,交換到孩子結點位置,繼續和下面的兩個孩子比較,直到滿足大根堆條件swap(source,
0, --size);
int heapify(int source, int index, int size)//4、重複第2步,第3步,直到size = 0 ,整個陣列排序過程結束index表示要和它兩個孩子比較的結點
else
break
; }
}
while (size > 0源**如下)
#define _crt_secure_no_warnings#include輸出結果#include
#include
int swap(int source, int a, int
b)int heapsort(int source, int
len)
int size =len;
while (size > 0
)
}int heapinsert(int source, int
index)
}int heapify(int source, int index, int size)//
index表示要和它兩個孩子比較的結點
else
break
; }
}int
main()
;
intlen;
len = sizeof(source) / sizeof(int
); heapsort(source, len);
for (int i = 0; i < len; i++)
}
以上就是堆排序的所有細節,這個版本很優良,堆排序的額外空間複雜度是o(1),如果用遞迴的話,遞迴有遞迴棧,額外空間複雜度不就上去了嗎,設計成這種迭代的可以省空間,時間複雜度為o(n log n)
教你一步步啟動程式
今天介紹一下專案的啟動流程,專案主要分為前端 和後台 兩個部分,下面以專案名稱為 product 舉例 我們存放前端 的資料夾為 product web 存放後台 的資料夾為 product server 啟動前提 1.已安裝nodejs和npm管理工具,並設定全域性變數 2.輸入命令行時必須確保在...
一步步教你上架iOS APP
注意,注意,注意 一定要設定enable xombie objects為不勾選。在edit scheme中有乙個run,然後選擇diagnostics,然後取消勾選enable zombie objects。如果沒有勾選就不用動了。這是是provisioning profiles 可以理解為配置概要...
一步步教你接入個推 推送
一 manifast中的配置 許可權 com.example.youzhen android name getui.permission.getuiservice.com.example.youzhen android protectionlevel normal 其他的一些 android val...