排序演算法實踐

2021-05-22 13:33:53 字數 1626 閱讀 8139

那天閱讀《**之美》這本書的章節,寫個程式試試其中的排序演算法的例子,執行成功後,突然想試試和vc9自帶的 stl sort函式比較一下,測試結果出乎我所料,這個例子比stl 的sort函式一般快上3~4倍之多,覺得很是奇怪,檢查了一下,發現應該是debug版的原因,切換到release版再測,對於小資料stl 的sort要快很多,但是碰到大資料量(千萬級別的資料)的時候,這個例子有的時候反到要快不少。難道真的如《程式設計實踐》裡所說的那樣「stl作為c++ 的乙個新部分,仍然受到不成熟實現的損害。。。」對於vc stl我以前做資料夾同步功能的時候過一些研究,我當時用的是vc6,不像sgi stl sort為保證其最差速度是也是logn而採用的是混合排序法(快速排序,插入排序,堆排序),它的sort函式用的就是快速排序演算法。照理說應該和這裡例子函式速度差不多。帶著疑問,我開啟《檔案中檢視其中的的sort函式**,結果發現vc9也已經與時俱進,其中sort函式用的也是如同sgi stl一樣的混合排序法,當分割資料次數過多的時候(allow 1.5 log2(n) divisions),使用堆排序或者插入排序演算法。這樣的話能夠避免最差速度為n*n,但是魚和熊掌不可兼得,一般情況下肯定會影響到排序速度(快速排序演算法一般會比堆排序或者插入排序演算法要快)。就向候捷曾經說過的」原始碼

之前,了無秘密「。以下附上例子**以及vc9sort**。

例子**:

//#include "stdafx.h"

#include "stdlib.h"

#include "time.h"

#include "windows.h"

#include #include #include using namespace std;

void quicksort(int* data, int l, int u);

int _tmain(int argc, _tchar* argv)

wcout << _t("begin to sort data1 by my quicksort") << endl;

dword d1 = gettickcount();

quicksort(&data1[0], 0, data1.size()-1);

dword cost_time = gettickcount() - d1;

wcout << _t("cost time:") << cost_time << _t("ms") << endl;

/* for (vector::size_type i = 0; i < data1.size(); i++)

wcout << endl;//*/

wcout << _t("begin to sort data2 by stl quicksort") << endl;

d1 = gettickcount();

sort(data2.begin(), data2.end());

cost_time = gettickcount() - d1;

wcout << _t("cost time:") << cost_time << _t("ms") << endl;

return 0;

}void swap(int* data, int l, int m)

void quicksort(int* data, int l, int u)

vc9sort**:

排序演算法實踐

輸入有兩行,第一行是乙個正整數,表示有n個同學參與調查 n 第二行有 個用空格隔開的正整數,為每本圖書的 號 假設圖書的isbn號在 1 1000之間 輸出有兩行,第一行是乙個正整數k,表示需要買多少本書。第二行是k個用空格隔開的正整數,為從小到大已排序的需要購買的圖書的isbn號。先排序,再去重。...

各常見排序演算法實踐

如題。實踐了下幾種比較常見的內排演算法。並對各種排序演算法的執行效率也排了個序。資料量不大的情況下,一般是堆排比較快。資料量很大時,快排才會有優勢。截圖如下 為了更清楚看到結果,執行的是debug版。呵呵。下面來一段bt點的。看過 瘋狂的程式設計師 嗎?p162最後乙個段落開頭有這樣一句話 絕影晃眼...

10種排序演算法,沒有實踐

1.氣泡排序 2.選擇排序 3.插入排序 4.交換排序 5.歸併排序 6.快速排序 7.希爾排序 8.堆排序 9.雙向氣泡排序 10.計數排序 排序演算法是一種基本並且常用的演算法。由於實際工作中處理的數量巨大,所以排序演算法 對演算法本身的速度要求很高。而一般我們所謂的演算法的效能主要是指演算法的...