位排序演算法

2022-08-28 15:39:28 字數 1504 閱讀 1589

位排序演算法,一種占用記憶體小、執行時間快應用於特殊情況的演算法

0x01.問題背景

0x02.解決方法

1.歸併排序

磁碟檔案最常用的排序演算法就是歸併排序,但是對於千萬數量級別的資料,執行時間是以天為單位

// 歸併排序演算法實現

int mergesortcore(int &array,int lo,int mid,int hi)

}void mergesort(int &arr,int left,int right)

void sort(int arr)

2.分治+快速排序

1mb的記憶體空間

1mb=1024kb=1024x1024=1048576 byte

每個數是7位百萬級別的整數

32bit=4byte可以表示的範圍(04294967296,-21474836482147483647)

1048576/4=262144

10^7/40=250000

// define the swap function

void swap(int &arr,int lo,int hi)

int partiton(int &arr,int left,int right)

else

}swap(arr,lo,j);

return j;

}// optimization partition function

int optpartition(int &arr,int lo,int hi)

// 將flag放入正確的位置

swap(arr,lo,j);

return j;

}void quicksort(int &arr,int lo,int hi)

int index=partiton(arr,lo,hi);

quicksort(arr,lo,index-1);

quicksort(arr,index+1,hi);

}void sort(int &arr)

3.位排序演算法

使用位圖(位向量)來表示集合,用百萬bit位的字串來表示

01010001100 這個字串表示四個數存在(下標位置)

10^7/8=1250000 大概是1.19mb,記憶體大小剛剛夠

// 偽**,沒有考慮檔案的輸入輸出

// 定義陣列也是不對,只是為了說明問題

#include#define max_vlaue 10000000

int main()

// second step

// todo condtion 表示檔案中存在這個數

for(int i=0;i// third step

for(int i=0;ireturn 0;

}

位反轉演算法

比如0x12 0001 0010 反轉後變成 0100 1000 即0x48 static unsigned char buf 0x12,buf1 0 static int m,n for m 7,n 0 m n 0 m n buf buf1 將兩位元組short型別數高低位元組取出來 unsign...

演算法 位運算

public static intpowern int m,int n return m public static void main string args public static boolean ispower int n return false num如何使2的n次冪,那麼num nu...

位向量和排序

對於排序問題,想必大家都非常熟悉。而且,應該都知道基於比較的排序方法的時間複雜度的下界是 o n logn 儘管又出現了基數排序,使得排序類演算法的時間複雜度改進到 o d n 但是基數排序方法實現起來還是比較麻煩的。下面這種排序方法的時間複雜度可以認為是 o n 但是和基數排序方法相比,它的實現非...