堆排序查詢前N個最大數和二分查詢演算法

2021-06-19 09:19:17 字數 1579 閱讀 8298

先了解堆排序概念:堆排序利用了大根堆(或小根堆)堆頂記錄的關鍵字最大(或最小)這一特徵,使得在當前無序區中選取最大(或最小)關鍵字的記錄變得簡單。

(1)用大根堆排序的基本思想

① 先將初始檔案r[1..n]建成乙個大根堆,此堆為初始的無序區

② 再將關鍵字最大的記錄r[1](即堆頂)和無序區的最後乙個記錄r[n]交換,由此得到新的無序區r[1..n-1]和有序區r[n],且滿足r[1..n-1].keys≤r[n].key

③由於交換後新的根r[1]可能違反堆性質,故應將當前無序區r[1..n-1]調整為堆。然後再次將r[1..n-1]中關鍵字最大的記錄r[1]和該區間的最後乙個記錄r[n-1]交換,由此得到新的無序區r[1..n-2]和有序區r[n-1..n],且仍滿足關係r[1..n-2].keys≤r[n-1..n].keys,同樣要將r[1..n-2]調整為堆。

……直到無序區只有乙個元素為止。

(2)大根堆排序演算法的基本操作:

① 初始化操作:將r[1..n]構造為初始堆;

② 每一趟排序的基本操作:將當前無序區的堆頂記錄r[1]和該區間的最後乙個記錄交換,然後將新的無序區調整為堆(亦稱重建堆)。

時間複雜度為o(n*logn)

#include #include #include #include #include #include #include using namespace std;

//建立大根堆,即父節點大於兩個子節點

void maxheapcreate(int array,int n,int length) else }}

void heapsort(int array,int length)

for( i = length-1; i > 0 ; i-- )

}void findfirstn(int array,int length,int result,int n)

for( i = length-1,j=0; j0 ; i--)

}templateint binsearch(t array,int length,t key) else if( array[mid] > key ) else

low = mid + 1;

}if(low>high)

return -1;

}int main()

;int a_length = sizeof(array)/sizeof(int);

heapsort(array,a_length);

while(a_length--)

printf("array[%d]=%d\n",a_length,array[a_length]);

printf("-=-=-=-=-=利用堆排序查詢前n個最大元素=-=-=-=-=-=-=-=-=-=-=\n");

int array2=;

int a2_length = sizeof(array2)/sizeof(int);

int nn=3;

int result[3];

findfirstn(array2,a2_length,result,3);

for(a2_length=0;a2_length

演算法 通過堆排序,獲取前N個最大數

在一組無序陣列中,比如 1,9,8,2,7,3,6,4,5 將陣列看做是乙個堆,也可以用二叉樹來表示 但是這個堆現在還不是大頂堆,大頂堆的特點是父節點永遠大於左右子節點 第一步需要將這個堆構建成大頂堆 構建前需要知道的幾點 構建大頂堆 param array 原始陣列 param length 需要...

二分查詢和排序

二分查詢,主要是針對排序問題進行查詢 len sizeof a sizeof a 0 我們先設定 int left 0 int right len 1 int mid left right 2 如果k大於mid,那麼 left mid 1 小於 right mid 1 include int sea...

氣泡排序和二分查詢

氣泡排序 public class bubblesorttest public static void bubblesort int array for int i 0 i array.length 1 i 其實此處可以換成i是最大的 for int j 0 j array.length i 1 j...