位排序演算法,一種占用記憶體小、執行時間快應用於特殊情況的演算法
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 但是和基數排序方法相比,它的實現非...