1. 程式人生 > >面試題7-2:時間複雜度為O(n)的排序

面試題7-2:時間複雜度為O(n)的排序

問題:請實現一個排序演算法,要求排序一個公司幾萬名員工的年齡,要求時間複雜度為O(n)。

思路:要排序的序列元素數量比較大,不適合用傳統的排序方法,但問題的要求是排序員工的年齡,也就是說,每個元素都在一個很小的範圍之內(1-100)。

又要求時間複雜度為O(n),但沒有要求空間複雜度,所以此時我們應該想到利用一段輔助空間來幫助排序。

利用一個timesOfAge[100]的陣列,每個位置儲存該年齡有多少名員工,比如timesOfAge[20] = 5,表明該公司年齡為20歲的員工有5名。timesOfAge[50]=0,表明沒有50歲的員工

將所有員工的年齡存入timesOfAge中後,最後在遍歷一遍timesOfAge陣列,忽略timesOfAge[I]=0的位置,將timesOfAge[I]!=0的位置重新放入age陣列中。

void sortAges(int age[], int length)
{
    int timeOfAges[101];
    
    for(int i = 0; i < length; ++i)
        timeOfAges[i] = 0;
    
    for(int i = 0; i < length; ++i)
    {
        timeOfAges[ age[i] ]++;
    }
    
    int index = 0;
    for(int i = 0; i < 101; ++i)
    {
        if(timeOfAges[i] != 0)
        {
            for(int j = 0; j < timeOfAges[i]; ++j)
            {
                age[index++] = i;
            }
        }
    }
    
}


int main(int argc, const char * argv[]) {
    
    int age[] = {18,20,21,22,22,23,18,18,18,30,25,26,29,22};
    int size = sizeof(age)/sizeof(int);
    sortAges(age, size);
    
    for(int i = 0; i < size; ++i)
        cout<<age[i]<<" ";
    cout<<endl;
        
    
        return 0;
}


相關推薦

試題7-2:時間複雜O(n)的排序

問題:請實現一個排序演算法,要求排序一個公司幾萬名員工的年齡,要求時間複雜度為O(n)。 思路:要排序的序列元素數量比較大,不適合用傳統的排序方法,但問題的要求是排序員工的年齡,也就是說,每個元素都在一個很小的範圍之內(1-100)。 又要求時間複雜度為O(n),但沒有要求

有1,2,....一直到n的無序陣列,求排序演算法,要求時間複雜O(n),空間複雜O(1)

http://blog.csdn.net/dazhong159/article/details/7921527 1、有1,2,....一直到n的無序陣列,求排序演算法,並且要求時間複雜度為O(n),空間複雜度O(1),使用交換,而且一次只能交換兩個數。 #include &

第4章 貪心演算法,Dijkstra演算法(鄰接矩陣儲存,時間複雜O(n^2))

#include <iostream> #include <cstdio> #include <cstring> using namespace std; #d

在一個含有空格字元的字串中加入XXX,演算法時間複雜O(N)

import java.util.Scanner; /** * */ /** * @author jueying: * @version 建立時間:2018-10-18 下午10:54:54 * 類說明 */ /** * @author jueying

【2019新浪&微博筆試題目】判斷連結串列是否迴文結構,空間負責O(1),時間複雜O(n)

原題描述 判斷一個連結串列是否為迴文結構,要求額外空間複雜度為O(1),時間複雜度為O(n) 解題思路 一、雙向連結串列 如果連結串列是雙向連結串列,那簡直不要太完美。直接從連結串列兩端向中間遍歷即可判定 可惜,這個題目肯定不會說的是這種情況,

雜談——如何合併兩個有序連結串列(時間複雜O(n))

假設本帥博主有連結串列arr1: int[] arr1 = {1,3,6,8,23,34,56,77,90}; 連結串列arr2: int[] arr2 = {-90,34,55,79,87,98,123,234,567}; 我要如何才能夠合併這兩個有序連結串列,使得合併後的連結串列

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

【0】 目錄 【1】題目 【2】分析 【3】測試程式碼 【4】測試結果 【1】題目: 面試官: 請實現一個排序演算法,要求時間複雜度為O(N) 應聘者:請問對什麼數字進行排序,共有多少數字? 面試官:我們想對公司所有員工按年齡排序,我們公司共有幾

實現排序演算法,時間複雜O(n)

我們常用的排序氣泡排序 O(n^2); 快速排序O(nlogn);堆排序O(nlogn);選擇排序O(n^2); 我們常用的排序都不符合時間複雜度的要求; 經常聽說一個說法  用空間代替時間 現在要排序的陣列為陣列 a;例如a數組裡面有  1,1,2,2,3,3,2,2,5

【C++實現】第k大元素 時間複雜O(n),空間複雜O(1)

解題思路: 二基準快速排序,在排序時判斷每次找到的標記點下標 p 與 n-k 的大小,若小於n-k,則只需在p的右側繼續遞迴,若大於 p 則只需在p 的左側遞迴,直至 p 與 n-k 相等 vs可執行程式碼 #include<ctime> #includ

時間複雜O(N*logN)的常用排序演算法總結與Java實現

時間複雜度為O(N*logN)的常用排序演算法主要有四個——快速排序、歸併排序、堆排序、希爾排序1.快速排序·基本思想    隨機的在待排序陣列arr中選取一個元素作為標記記為arr[index](有時也直接選擇起始位置),然後在arr中從後至前以下標j尋找比arr[inde

求最大連續子序列的和,時間複雜 O(n)

練習題目 給定陣列 [ a0, a1, a2, …, an ] ,找出其最大連續子序列和,要求時間複雜度為 O(n),陣列包含負數。 例如:輸入 [ -2,11,-4,13,-5,-2] ,輸出 20(即 11 到 13)。 解答 關於這個問題有很多種解法,這裡介紹一種時間複雜度僅為 O(n)

把一個含有N個元素的陣列迴圈右移K位, 要求時間複雜O(N)

分析與解法 這個解法其實在《啊哈!演算法》有講到。 假設原陣列序列為abcd1234,要求變換成的陣列序列為1234abcd,即迴圈右移了4位,比較之後,不難看出,其中有兩段的順序是不變的:1234和abcd,可把兩段看成兩個整體。右移K位的過程就是把陣列的兩部分交換一下。

長度n的順序表L,編寫一個時間複雜O(n),空間複雜O(1)的演算法,該演算法刪除線性表中所有值X的元素

解法:用K記錄順序表L中不等於X的元素個數,邊掃描L邊統計K,並將不等於X的元素向前放置K位置上,最後修改L長度 void  del_x_1(SqList &L,Elemtype x){ int k=0; for(i=0;i<L.length;i++) {

Manacher演算法:求解最長迴文字串,時間複雜O(N)

迴文串定義:“迴文串”是一個正讀和反讀都一樣的字串,比如“level”或者“noon”等等就是迴文串。迴文子串,顧名思義,即字串中滿足迴文性質的子串。 經常有一些題目圍繞回文子串進行討論,比如POJ3974最長迴文,求最長迴文子串的長度。樸素演算法是依次以每一個字元為中心

將陣列排序,陣列中所有的負整數出現在正整數前面(時間複雜 O(n), 空間複雜 O(1)).

<pre name="code" class="plain">#include <stdio.h> #define N 10 void swap (int *a, int i,

刪除線性表中所有值x的元素,要求時間複雜O(n),空間複雜O(1)

思路:統計不等於x的個數,用k記錄不等於x的元素的個數。邊統計邊把當前元素放在第k個位置上,最後修改表的長度 public static void del(List<Integer> l

分治法 求 逆序對數 的個數 時間複雜O(n*logn)

思路: 分治法 歸併排序的過程中,有一步是從左右兩個陣列中,每次都取出小的那個元素放到tmp[]陣列中 右邊的陣列其實就是原陣列中位於右側的元素。當不取左側的元素而取右側的元素時,說明左側剩下的元素均

尋找陣列中第k小的數:平均情況下時間複雜O(n)的快速選擇演算法

又叫線性選擇演算法,這是一種平均情況下時間複雜度為O(n)的快速選擇演算法,用到的是快速排序中的第一步,將第一個數作為中樞,使大於它的所有數放到它右邊,小於它的所有數放到它左邊。之後比較該中樞的最後位

演算法設計:將一個數組分奇數、偶數左右兩個部分,要求時間複雜O(n)

        已知陣列A[n]中的元素為整型,設計演算法將其調整為左右兩部分,左邊所有元素為奇數,右邊所有元素為偶數,並要求演算法的時間複雜度為O(n)。 程式碼實現部分: #include &l

大數相乘(分治法實現時間複雜O(n^1.59))

/* * Author: dengzhaoqun * Date: 2011/04/11 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #