程式設計珠璣 位排序 bitsort

2022-03-30 05:42:30 字數 2947 閱讀 4925

在《程式設計珠璣》一書上,有一題是將一堆不重複的數進行排序,這些數的值大小位於[0, 10000000).

然後作者在書後給出的答案確實很精闢,利用位排序將這個問題輕而易舉的解決了。

首先弄懂i>>shift相當於i/32,i&mask相當於i%32.

題目中說了

replace above 

2lines with below

3for

word

-parallel init

inttop =1

+n/bitsperword;

for(i =0

; i

<

top; i++)

a[i] =0

;

那麼就採用這個,把a陣列中的元素都設定為0.

整個程式的思想就是:

1.每個整數有32位,那麼它就可以表示32個數,分別對應每bit位為1.

2.然後把10000000個數分為1+n/bitsperword組(相當於有這麼多個桶),每組包含接近32個數。

上面的解釋可能仍不到位,那我們來看具體的函式:

對於set函式,我們可以這樣理解,

arr[i>>shift] |= (1<

arr[i/32] = arr[i/32] | (1<

i%32必然處於區間[0, 31],那麼1<

對於test函式,就是上面過程的反過程了。它是用來判斷i個這個數是否存在,即arr[i/32]的相應bit位是否為1.

最後,就做排序了,

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

由於[0, n)已經是從小到大排序好的,那麼我們只需判斷每個數是否存在,若存在,就輸出,所以輸出結果也就是排序的了。

#include

<

stdio.h

>

#define

n 10000000

#define

bitsperword 32

#define

shift 5

#define

mask 0x1f

intarr[1+

n/bitsperword];

void 

set(

inti)

inttest(

inti)

intmain()

//fclose(file);//}

file

*in_file

=freopen("in

", "r

", stdin);

file

*out_file

=freopen(

"out",

"w", stdout);

if(in_file

!=null)

if(out_file

!=null)

fclose(out_file);

return0;

}在《程式設計珠璣》一書上,有一題是將一堆不重複的數進行排序,這些數的值大小位於[0, 10000000).

然後作者在書後給出的答案確實很精闢,利用位排序將這個問題輕而易舉的解決了。

首先弄懂i>>shift相當於i/32,i&mask相當於i%32.

題目中說了

replace above 

2lines with below

3for

word

-parallel init

inttop =1

+n/bitsperword;

for(i =0

; i

<

top; i++)

a[i] =0

;

那麼就採用這個,把a陣列中的元素都設定為0.

整個程式的思想就是:

1.每個整數有32位,那麼它就可以表示32個數,分別對應每bit位為1.

2.然後把10000000個數分為1+n/bitsperword組(相當於有這麼多個桶),每組包含接近32個數。

上面的解釋可能仍不到位,那我們來看具體的函式:

對於set函式,我們可以這樣理解,

arr[i>>shift] |= (1<

arr[i/32] = arr[i/32] | (1<

i%32必然處於區間[0, 31],那麼1<

對於test函式,就是上面過程的反過程了。它是用來判斷i個這個數是否存在,即arr[i/32]的相應bit位是否為1.

最後,就做排序了,

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

由於[0, n)已經是從小到大排序好的,那麼我們只需判斷每個數是否存在,若存在,就輸出,所以輸出結果也就是排序的了。

#include

<

stdio.h

>

#define

n 10000000

#define

bitsperword 32

#define

shift 5

#define

mask 0x1f

intarr[1+

n/bitsperword];

void 

set(

inti)

inttest(

inti)

intmain()

//fclose(file);//}

file

*in_file

=freopen("in

", "r

", stdin);

file

*out_file

=freopen(

"out",

"w", stdout);

if(in_file

!=null)

if(out_file

!=null)

fclose(out_file);

return0;

}

利用位運算解決排序問題(摘自程式設計珠璣)

問題背景 已知資料的取值範圍在0 10000000,且所取資料不重複,將輸入的資料排序並盡可能的使用少的記憶體空間 define bitsperrword 32 define shift 5 define mask 0x1f define n 10000000 include int a 1 n b...

插入排序 《程式設計珠璣》

插入排序法 插入排序的基本操作就是將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的 個數加一的有序資料,演算法適用於少量資料的排序,時間複雜度 為o n 2 是穩定的排序方法。插入演算法把要排序的 陣列分成兩部分 第一部分包含了這個陣列的所有元素,但將最後乙個元素除外,而第二部分就只包含這乙...

程式設計珠璣之快速排序

我們將需要劃分的目標區間定位 l,u 首先給定目標值t x l 我們需要重新組織x l.u 使得所有小於t的元素都在m的一端,所有大於t的元素在m的另一端。初始時m l,我們將i從l 1一直遍歷到u,在檢測第i個元素時必須考慮兩種情況。如果x i t,那麼一切正常,不變式為真 如果x i void ...