題目:某公司有幾萬名員工,請完成乙個時間複雜度為o(n)的演算法對該公司員工的年齡作排序,可使用o(1)的輔助空間。
思路:歸併,快排,插入,等排序最快為o(nlgn)的時間複雜度
要達到o(n)的時間複雜度 只有計數排序,桶排序,基數排序法才能達到
考慮到公司員工入職和離職的年齡範圍是固定的都是介於 1-100之間的數,所以可以通過計數排序來解決問題
那麼計數排序究竟是什麼思路呢,當然類似雜湊表的陣列,遍歷員工表 相應年齡對應的人數目+1,那麼就可以得到每個年齡對應的人數,
接下來進行疊加,比如年齡為26歲的員工 如果要排序應該放到陣列的什麼位置呢,當然是小於26以及等於26的人數總和,此位置為最後乙個年齡為26的員工的位置,當然以後加入員工可以將其對應的位置-1,還屬於26歲員工所處的區段
那麼最後就是根據每個年齡需要放到的陣列的位置放入相關元素即可。
**如下
#include "stdio.h"
#define max 100
int main()
; int i;
int *temp = null;
int len = sizeof(employee)/sizeof(int);
temp = calloc(len,sizeof(int));
memset(age,0,sizeof(int)*max);
for(i=len-1;i>=0;i--)
for(i=1;i=0;i--)
for(i=0;i
他從相反的角度考慮問題,從年齡小的向年齡大的排
也許記錄每個年齡的人數,但是不用疊加,採用的是從年齡小 到大,相同年齡的,無外乎就是累加,重複往陣列新增唄
**如下:
#include "stdio.h"
#define max 100
int main()
; int i,j;
int index;
int *temp = null;
int len = sizeof(employee)/sizeof(int);
temp = calloc(len,sizeof(int));
memset(age,0,sizeof(int)*max);
for(i=len-1;i>=0;i--)
index = 0;
for(i=0;i
面試訓練烙餅排序實現
程式設計之美的演算法思想很好,可是有些地方很難一下子看明白,對於我這種急性子的人,很難一下搞懂。通俗的將這道題的思路是這樣子的 加入烙餅序列 為 1 7 3 5 6 2 4 我們認為 4 為餅子的頂端,由於只能把下面的多塊餅移到上面,然後再反轉移到響應的位置。實際上 就是從 底層開始 我們找未放在原...
O n 時間的排序
題目 某公司有幾萬名員工,請完成乙個時間複雜度為o n 的演算法對該公司員工的年齡作排序,可使用o 1 的輔助空間。題目特別強調是對乙個公司的員工的年齡作排序。員工的數目雖然有幾萬人,但這幾萬員工的年齡卻只有幾十種可能。上班早的人一般也要等到將近二十歲才上班,一般人再晚到了六七十歲也不得不退休。由於...
面試訓練營
1 重寫與過載之間的區別 方法過載 1 同乙個類中 2 方法名相同,引數列表不同 引數順序 個數 型別 3 方法返回值 訪問修飾符任意 4 與方法的引數名無關 方法重寫 1 有繼承關係的子類中 2 方法名相同,引數列表相同 引數順序 個數 型別 方法返回值相同 3 訪問修飾符,訪問範圍需要大於等於父...