VB 預留排序法 百萬條資料只需30毫秒

2021-09-24 12:20:26 字數 2086 閱讀 8925

哈里在最近的程式設計生活中,突發奇想,開始著手文字的分析。

期間涉及到了陣列的排序。於是想也沒想祭出了自己祖傳的「撲克牌排序法」,即插值排序。

不過當後期陣列元素個數大於100萬的時候,祖傳方法明顯慢了下來,需要長達幾十分鐘的排序(vb.6.0與vb.net均如此,vb6.0更慢)。

在排序演算法的優化中,想到了一種新型排序方法:預留排序法。(新演算法100萬條資料僅需29毫秒,名字起的比較隨意)

預留排序法的步驟主要有三步:

1、找到需要排序陣列的最小值與最大值。(如果語言不支援負陣列,則利用乙個偏移將負值偏移至0)

2、獲取需要排序陣列的每種出現過的值的重複數量。

3、通過記憶體位置**,將需要排序的陣列的遍歷序放入排序索引陣列完成排序。

(以下例子預設需要排序的最小值大於或等於1)

vb6.0例項如下:(百萬條資料3.6秒)

public function 預留法排序(陣列() as long, 排序() as long)

dim 數量() as long, i as long, 陣列最大值 as long, 偏移() as long

redim 排序(ubound(陣列))

for i = 1 to ubound(陣列)

if 陣列(i) > 陣列最大值 then

陣列最大值 = 陣列(i)

end if

next

redim 數量(陣列最大值), 偏移(陣列最大值)

for i = 1 to ubound(陣列)

數量(陣列(i)) = 數量(陣列(i)) + 1

next

for i = 1 to ubound(陣列)

偏移(陣列(i)) = 偏移(陣列(i)) + 1

排序(陣列求和(數量, 陣列(i)) + 偏移(陣列(i))) = i

next

end function

private function 陣列求和(陣列() as long, 截止序 as long) as long

dim i as long

for i = lbound(陣列) to 截止序 - 1

陣列求和 = 陣列求和 + 陣列(i)

next

end function

不得不說vb.net的運算速度比vb6.0快得多得多,所以vb.net的例項哈里也準備了乙份:(百萬條資料29毫秒)

public sub 預留法排序(陣列() as long, 排序() as long)

dim 數量() as long, i as long, 陣列最大值 as long, 偏移() as long

redim 排序(ubound(陣列))

'獲得陣列最大值

for i = 1 to ubound(陣列)

if 陣列(i) > 陣列最大值 then

陣列最大值 = 陣列(i)

end if

next

redim 數量(陣列最大值), 偏移(陣列最大值)

'重複值劃分統計

for i = 1 to ubound(陣列)

數量(陣列(i)) += 1

next

'最終排序

for i = 1 to ubound(陣列)

偏移(陣列(i)) += 1

排序(陣列求和(數量, 陣列(i)) + 偏移(陣列(i))) = i

next

end function

private function 陣列求和(陣列() as long, 截止序 as long) as long

dim i as long, 輸出 as long

for i = lbound(陣列) to 截止序 - 1

輸出 += 陣列(i)

next

return 輸出

end function

(ps:以上所有耗時資料基於intel i9 9900k默頻。)

百萬條資料分頁

寫出 之前,先說明一下原理,比較簡單。有一張表 test 如下 結構是 id 自動編號 txt 假設40條記錄 現在要每頁顯示10條記錄,則每頁要顯示的資料應該是 第一頁 10 第二頁 11 20 第三頁 21 30 第四頁 31 40 如要顯示第一頁,最簡單的方法就是 select top 10 ...

SQL高效分頁(百萬條資料)

select top 頁大小 from select row number over order by id as rownumber,from table1 as a where rownumber 頁大小 頁數 1 註解 首先利用row number 為table1表的每一行新增乙個行號,給行號...

如何利用jdbc快速插入百萬條資料

當須要向資料庫插入百萬條資料時,利用hibernate,mybatis等持久層框架時耗時較久,此時使用jdbc插入效率會更高。此種場景特別適用於讀取檔案匯入到資料庫。可以利用批處理來加快jdbc的插入效率。string sql insert into person id,name values co...