《劍指Offer》 排序演算法

2021-09-24 10:34:00 字數 1937 閱讀 4996

簡單排序:直接插入、直接選擇、冒泡  o(n2)

優化排序:希爾排序、堆排序、快速排序   o(n log n)

歸併排序。

要能夠從時間複雜度、空間複雜度比較優缺點。

陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列**現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。

法一:雜湊表

class solution 

return 0;

}};

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。

法一:使用stl的sort  o(nlogn)

class solution 

input[low]=pivot;

return low;

}};

法三、multiset容器的排序屬性 o(n log k)  底層:紅黑樹

class solution 

};

四、最大堆, 堆頂一直是最大值,pop_heap

堆:make_heap、pop_heap、push_heap、sort_heap

class solution 

//新插入的數本身就大,直接插入右邊的最小堆

min.push_back(num);//先加入vector中

push_heap(min.begin(),min.end(),greater());//再對插入後的新vector通過push_heap重新排序,降序

}else

max.push_back(num);

push_heap(max.begin(),max.end(),less());}}

double getmedian()

private:

vectormin;//最小堆,體現在push_heap和pop_heap時引數用,降序greater()

vectormax;//最大堆,否則預設公升序,即預設less()

};

class solution 

double getmedian()

};

priority_queue本質是乙個堆。

priority_queue 優先佇列,其底層是用堆來實現的。在優先佇列中,隊首元素一定是當前佇列中優先順序最高的那乙個。

在優先佇列中,沒有 front() 函式與 back() 函式,而只能通過 top() 函式來訪問隊首元素(也可稱為堆頂元素),也就是優先順序最高的元素。

1. 標頭檔案是#include

2. 關於priority_queue中元素的比較

模板申明帶3個引數:priority_queue,其中type 為資料型別,container為儲存資料的容器,functional 為元素比較方式。

container必須是用陣列實現的容器,比如vector,deque等等,但不能用 list。stl裡面預設用的是vector。

2.1 比較方式預設用operator<,所以如果把後面2個引數預設的話,優先佇列就是大頂堆(降序),隊頭元素最大。

//下面兩種優先佇列的定義是等價的

priority_queuep;

priority_queue,less> p;//後面有乙個空格

//公升序,第乙個最小

priority_queue,greater>q;

#include #include using namespace std;

int main()

return 0;

}

劍指offer 排序演算法

常用排序演算法自主手寫 1 氣泡排序 時間o n 2 空間o 1 穩定,資料有序效果越好 void bubblesort int a,int n flag 1說明該趟不是全部都有序,需要繼續比較 flag 0說明沒有進行互換,陣列已經有序了,沒有必要繼續比較,直接結束 2 選擇排序 時間o n 2 ...

《劍指offer》 排序

一 資料流中的中位數 題目描述 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料...

演算法 劍指offer

思路 若百位上數字為0,百位上可能出現1的次數由更高位決定 若百位上數字為1,百位上可能出現1的次數不僅受更高位影響還受低位影響 若百位上數字大於1,則百位上出現1的情況僅由更高位決定。舉例 個位1出現的次數 round 1 1 每次迴圈1出現一次,0 9迴圈了53次,第54次迴圈為0 4 十位1出...