一、資料流中的中位數
題目描述:如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert()方法讀取資料流,使用getmedian()方法獲取當前讀取資料的中位數。
解題思路:這裡考慮到是從資料流中獲取,那麼資料就是不斷更新的。使用大頂堆來存放排序後前半部分(小的數),使用小頂堆來存放排序後的後半部分(大的數)。其中需要注意的是以下堆的幾個操作:
將元素入堆:m.push_back(x);
向堆中新增新的元素作為葉子節點:push_heap(m.begin(),m.end(),less())
堆頂元素出堆:
pop_heap(m.begin(),m.end(),less())
m.pop_back()
class solution
//將大頂堆中的堆頂元素放到小頂堆中以便平衡元素
min.push_back(num);
push_heap(min.begin(),min.end(),greater());
}else
//將小頂堆中的堆頂元素放到大頂堆中以便平衡元素
max.push_back(num);
push_heap(max.begin(), max.end(),less()); //堆頂元素出堆}}
double getmedian()
};
二、最小的k個數
題目描述:輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。
解題思路:
class solution ;
int k;
cin>>k;
kp_sort(arr,0,arr.size()-1);
for(int j=0;jcout
}
劍指offer 排序演算法
常用排序演算法自主手寫 1 氣泡排序 時間o n 2 空間o 1 穩定,資料有序效果越好 void bubblesort int a,int n flag 1說明該趟不是全部都有序,需要繼續比較 flag 0說明沒有進行互換,陣列已經有序了,沒有必要繼續比較,直接結束 2 選擇排序 時間o n 2 ...
《劍指Offer》 排序演算法
簡單排序 直接插入 直接選擇 冒泡 o n2 優化排序 希爾排序 堆排序 快速排序 o n log n 歸併排序。要能夠從時間複雜度 空間複雜度比較優缺點。陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列 現了5次,超過陣列長度的一半,因此輸...
劍指offer 歸併排序
package sai.xiaomi 2 歸併排序 author wangsai public class solution 2,歸併排序,在原陣列的基礎上對原陣列進行排序 param arr,待排序陣列 private static void mergesort int arr private s...