1. 程式人生 > >對公司幾萬名員工按年齡排序(時間複雜度為O(N))

對公司幾萬名員工按年齡排序(時間複雜度為O(N))

【0】 目錄

【1】題目
【2】分析
【3】測試程式碼
【4】測試結果

【1】題目:

面試官: 請實現一個排序演算法,要求時間複雜度為O(N)
應聘者:請問對什麼數字進行排序,共有多少數字?
面試官:我們想對公司所有員工按年齡排序,我們公司共有幾萬名員工;
應聘者:也就是說數字的大小在一個較小的範圍之內,對嗎?
面試官:是的
應聘者:可以使用輔助空間嗎?
面試官:看你用多少記憶體,只允許使用常量大小的輔助空間,不得超過O(N);
應聘者:好的,我知道了;,

【2】分析:

通過面試官的要求,我們可以確定的是,是要求在一個有限範圍內排序,並且實現效率為O(N),那麼我們可以將員工年紀設定在0~99範圍內,藉助一個輔助空間,可以是一個數組,用來儲存從0到99歲這100個年齡出現的次數,某個年紀每出現一次,就給對應下標的空間加1,然後再根據這個陣列中記錄的次數,確定該年紀在原陣列中相應出現多少次;

【3】測試實現:

#include<iostream>
using namespace std;
//=====================================演算法==========================================
int sortage(int ages[], int length)
{
    if(ages == NULL || length <= 0)
    {
        printf("引數傳遞錯誤:ages == NULL || length <= 0\n");
            return -1
; } const int oldestage = 99; int timesofage[oldestage + 1]; for (int i =0 ; i<= oldestage ; ++i) timesofage[i] = 0; for(int i = 0; i< length; ++i ) { int age = ages[i]; if(age <= 0 ||age >oldestage ) { printf("年紀不在有效範圍內\n"
); return -1; } ++timesofage[age]; } int index = 0; for(int i = 0; i< oldestage ;++i ) { for(int j = 0; j<timesofage[i]; ++j ) { ages[index] = i; ++index; } } return 0; } //==================================測試程式碼===================================== void test() { int arr[20]={20,30,44,32,22,34,66,77,55,44,31,22,44,32,44,65,24,22,20, 35}; int length = sizeof(arr)/sizeof(arr[0]); printf("共有%d位員工年紀待排序\n",length ); int ret = sortage(arr,length); if(ret == 0) { printf("排序後:"); for(int i = 0;i<length ; ++i ) { printf("%d ",arr[i]); } printf("\n"); } } int main() { test(); return 0; }

【4】測試結果如下:

這裡已20位員工為例:
1、ages[20] = {20,30,44,32,22,34,66,77,55,44,31,22,44,32,44,65,24,22,20, 35}
這裡寫圖片描述
2、ages[20] = {100,30,44,32,22,34,66,77,55,44,31,22,44,32,44,65,24,22,20, 35}
這裡寫圖片描述

3、int ret = sortage( NULL , length);
這裡寫圖片描述

3、int ret = sortage( arr , 0);
這裡寫圖片描述