《劍指offer》 排序

2021-10-06 20:18:30 字數 1115 閱讀 4436

一、資料流中的中位數

題目描述:如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用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...