簡單排序:直接插入、直接選擇、冒泡 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出...