給10 7個無重複的整數排序

2022-05-03 01:18:12 字數 2674 閱讀 8987

題目:給10^7個無重複的整數排序,即1到10000000,盡量使空間複雜度小。

答:首先,我們利用程式來隨機生成這10^7個整數,用乙個全域性陣列儲存著10^7個整數,然後根據隨機生成的下標交換其中兩個整數的位置,以達到我們所說的整數是隨機的,具體請看下面的**:

const

int n = 10000000

;int data[n] = ;

void swap(int &a, int &b)

void generate_no_repeat_number(void

)

intp ,q;

srand((unsigned)time(null));

for (int i = 0; i < n; i++) //

通過隨機交換下標的方法,來使者10^7個整數達到真正的隨機

for (int i = 0; i < n; i++)

fclose(fp);

}

對於無重複的整數排序,用位圖法是最合適不過了,下面我們就來看看如何用位圖來實現對這10^7個整數排序。

第一種方法,我們可以借助乙個陣列,比如陣列的第乙個元素就表示0-31,第二個元素就表示32-63。這樣乙個整數就用乙個bit來表示。請看下面的**:

int flag[n / 32 + 1] = ; //

函式堆疊預設1m,此陣列大小大約為1.2m,已然大於預設堆疊大小,故用全域性陣列表示

void sort_by_array(void

)

for (int i = 1; i <= n; i++)

}clock_t end =clock();

cout

<

借助陣列排序所需時間為:

"<

<

fclose(fpread);

fclose(fpwrite);

}

第二種方法,直接借助stl中的bitset,這樣就更加簡單了,**如下:

bitset1>bit_map;

void sort_by_bitset(void

)

for (int i = 1; i <= n; i++)

}clock_t end =clock();

cout

<

借助bitset排序所需時間為:

"<

<

fclose(fpread);

fclose(fpwrite);

}

我們首先來看,未排序的數字如unsort_data.txt所示:

通過上面兩種方法,對檔案排序如下圖所示,其中sort_by_array.txt借助於陣列,sort_by_bitset.txt借助於bitset。

上面的這兩種方法,需要的記憶體大約都為1.2m,如果我只有1m不到的記憶體,那又該如何對這10^7個整數排序呢?其實不難,可以採用分治法,比如:先對1到5000000的整數排序,再對5000000到10000000的整數排序,請看下面**,我只給出用陣列去實現排序,記憶體使用大約為0.6m,如果空間複雜度要求更小,那可以接著對這些整數進行分治。stl的bitset就不寫了,very easy。。。

const

int max_part = 5000000

;void sort_by_part_array(void);

intnum;

while (eof != fscanf(fpread, "

%d", &num))

}for (int i = 1; i <= max_part; i++)

}fseek(fpread, 0,

seek_set

); memset(flag_part,

0, max_part/32 + 1

);

while (eof != fscanf(fpread, "

%d", &num))

}for (int i = 1; i <= max_part; i++)

}clock_t end =clock();

cout

<

借助部分陣列排序所需時間為:

"<

<

fclose(fpread);

fclose(fpwrite);

}

下圖為sort_by_part_array.txt與sort_by_array.txt的檔案對比

擴充套件:如前所述用位圖法,unsigned int 的取值範圍是0到2^32-1。我們可以申請連續的2^32/8=512m的記憶體,用每乙個bit對應乙個unsigned int數字。首先將512m記憶體都初始化為0,然後每處理乙個數字就將其對應的bit設定為1。當需要查詢時,直接找到對應bit,看其值是0還是1即可。

2023年1月22日 venow 完

微軟筆試題 給乙個包含10 7個整數的大檔案排序

這個題目有乙個前提條件,大檔案的中的資料有有乙個特點,那就是不存在重複的資料。就算是重複的資料,也只讓你求出去除重複之後的那些資料的排序結果。如果題目變成了這樣,我們就可以考慮建立乙個大的陣列。陣列的下表表示乙個整數,陣列的內容在我遍歷檔案的時候再賦值。如果陣列下標代表的那個整數存在,我們就把陣列的...

選擇法給陣列中十個整數排序

選擇法就是先將十個數中最大的數與a 0 對換 再將a 1 a 9 中最大的數與a 1 對換 每比較一輪,找出乙個未經排序的數中最大的乙個,共比較9輪。程式 如下 include include void sort int c,int b int main printf 十個數為 for i 0 i ...

leetcode 無重複字串的排序組合

題目 無重複字串的排列組合。編寫一種方法,計算某字串的所有排列組合,字串每個字元均不相同。示例1 輸入 s qwe 輸出 qwe qew wqe weq ewq eqw 字元都是英文本母。字串長度在 1,9 之間。解題思路 深度優先 貪心。每一層用for迴圈對已有字串逐個位置插入新字元,構造全部可能...