從partial sort挖掘堆排序

2021-09-30 04:01:18 字數 933 閱讀 1424

用過多次stl中的partial_sort演算法,卻全然不知其實現原理,也沒跟進stl原始碼中去深究。某天在**面試的時候被問到它的實現原理,沒能答出來,實在慚愧。閱讀partial_sort源**以後,有種似曾相識的感覺,哦~~原來是堆排序。以前只在書本上了解過堆排序,沒去認真了解和實現過,著實不知道它的妙處所在,如今災難降臨,給自己敲響警鐘。

堆排序:

關鍵字序列k[1...n]當滿足ki≤k2i且ki≤k2i+1 或(2)ki≥k2i且ki≥k2i+1(1≤i≤n/2

)這一條件時,稱該序列為堆序列,將此序列看成是完全二叉樹的話,則該二叉樹滿足這一條件:樹中任一非葉結點的關鍵字不大於或不小於它的左右孩子的關鍵字。

因此要實現堆排序應先解決兩個問題: 1.建立滿足條件的堆makeheap; 2.對堆進行排序heapsort。

奇怪,建立堆的時候不是根據條件已經排好序了嗎?條件中僅僅說明非葉結點和左右子結點之間的關係,並沒有說到左右子結點之間的關係,所以,還必須再排序。那要怎麼排?畫出二叉堆後很容易看出來,根部關鍵字肯定最大(或最小),所以,只需將其與序列末端的結點交換,交換以後,破壞了原有堆性質,必須重新建立新堆,當然,除去剛交換過後的「最值」結點(它不用再參與堆排序),如此反覆,將會得到乙個有序的序列。以下為建立小根堆和堆排序的**:

void ajustheap(int *arr, int len, int k)    //調整堆

if (arr[k] > arr[th])

}if (th == len && arr[k] > arr[th - 1])}

void makeheap(int *arr, int len)   //建立堆}

void popheap0(int *arr, int len)   //將根部結點交換到最後

void heapsort(int *arr, int len)    //堆排序

}

從整體上認識資料探勘

資料收集和資料儲存技術的快速進步,使得積累海量資料已成為家常便飯。然而,提取有用的資訊也成為巨大的挑戰。通常,由於資料量太大,無法使用傳統的資料處理工具和技術處理它。資料探勘 技術由此產生,資料探勘技術,它將傳統的資料分析方法與處理大量資料的複雜演算法相結合,從而實現處理大量資料的目的。資料探勘是在...

資料結構 從堆到「漏斗」

black box是一種原始的資料庫。它可以儲存乙個整數陣列,還有乙個特別的變數i。最開始的時候black box是空的 而i等於0。這個black box要處理一串命令。命令只有兩種 add x 把x元素放進blackbox get i加1,然後輸出blackhox中第i小的數。記住 第i小的數,...

學習機器學習從資料探勘開始

第乙個問題,為何要先從資料探勘開始。學習機器學習的話,你大部分都是一些資料演算法,演算法的一些應用才是我們最後想要的。而資料探勘呢?正好是機器學習最好的應用,從目前的情況來看,資料探勘,推薦系統的材料也是最豐富的,對學習機器學習的幫助很大。第二個問題,是不是學習機器學習的過程,就一定要從資料探勘開始...