對公司幾萬名員工按年齡排序(時間複雜度為O(N))
阿新 • • 發佈:2018-12-25
【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);