1樓:匿名使用者
qsort花了2秒多,那麼顯然是你程式有問題qsort的複雜度為o( n*log(n) ),以80萬來計算的話,計算量為百萬次,不會超時。
不過,如果你的輸入用的是cin的話,這麼大的輸入資料量,會超時。超時的原因是cin費時間。建議用scanf("%lf",&input);
scanf加上qsort肯定不會超時。
如果你需要比qsort更好的排序方法,那麼只有一個:堆排序。
但是,堆排序比qsort好的原因不是他的時間複雜度更高(大家都是o( n*log(n) ) 的時間複雜度)。僅僅是因為堆排序的空間複雜度比快排要低——o(n)的空間複雜度。
還有,stl裡面的sort的效率以我的使用經驗,比qsort要低。
2樓:匿名使用者
quick sort應該算快了
我沒研究
其實時間的話
用高階點的機器時間會快
3樓:匿名使用者
qsort一般沒有sort快,這是一個奇怪的現象,事實上你這個不可能超時
,為什麼你會超時呢,我用的sort函式,排了一百組8000000陣列,平均值是345ms,下面是我的測試程式(我還沒有減生成隨機數的時間)
#include
#include
using namespace std;
double num[800000];
int main()
cout << clock()/100 << endl;
system("pause");
}sort函式是一個快排+插入排序,比只快排要快很多,另外如果還不行你要在快排上加隨機化,選擇每個數做分劃時
4樓:匿名使用者
qsort需要2秒多麼?在我amd 2500的機器上,也只需要600ms的時間,用stl中的sort是300ms。
要更快的話,可以考慮基數排序,不過比較難寫。方法是建立表,將浮點數對映到整數,然後基數排序,速度大約可以提高3-10倍。
在快速排序, 堆排序,歸併排序中 哪個是最穩定的排序方法? 20
5樓:匿名使用者
1 快速排序(quicksort)
快速排序是一個就地排序,分而治之,大規模遞迴的演算法。
從本質上來說,它是歸併排序的就地版本。快速排序可以由下面四步組成。
(1) 如果不多於1個資料,直接返回。
(2) 一般選擇序列最左邊的值作為支點資料。
(3) 將序列分成2部分,一部分都大於支點資料,另外一部分都小於支點資料。
(4) 對兩邊利用遞迴排序數列。
快速排序比大部分排序演算法都要快。儘管我們可以在某些特殊的情況下寫出比快速排序快的演算法,但是就通常情況而言,沒有比它更快的了。快速排序是遞迴的,對於記憶體非常有限的機器來說,它不是一個好的選擇。
2 歸併排序(mergesort)
歸併排序先分解要排序的序列,從1分成2,2分成4,依次分解,當分解到只有1個一組的時候,就可以排序這些分組,然後依次合併回原來的序列中,這樣就可以排序所有資料。合併排序比堆排序稍微快一點,但是需要比堆排序多一倍的記憶體空間,因為它需要一個額外的陣列。
3 堆排序(heapsort)
堆排序適合於資料量非常大的場合(百萬資料)。
堆排序不需要大量的遞迴或者多維的暫存陣列。這對於資料量非常巨大的序列是合適的。比如超過數百萬條記錄,因為快速排序,歸併排序都使用遞迴來設計演算法,在資料量非常大的時候,可能會發生堆疊溢位錯誤。
堆排序會將所有的資料建成一個堆,最大的資料在堆頂,然後將堆頂資料和序列的最後一個資料交換。接下來再次重建堆,交換資料,依次下去,就可以排序所有的資料。
4 shell排序(shellsort)
shell排序通過將資料分成不同的組,先對每一組進行排序,然後再對所有的元素進行一次插入排序,以減少資料交換和移動的次數。平均效率是o(nlogn)。其中分組的合理性會對演算法產生重要的影響。
現在多用d.e.knuth的分組方法。
shell排序比氣泡排序快5倍,比插入排序大致快2倍。shell排序比起quicksort,mergesort,heapsort慢很多。但是它相對比較簡單,它適合於資料量在5000以下並且速度並不是特別重要的場合。
它對於資料量較小的數列重複排序是非常好的。
5 插入排序(insertsort)
插入排序通過把序列中的值插入一個已經排序好的序列中,直到該序列的結束。插入排序是對氣泡排序的改進。它比氣泡排序快2倍。
一般不用在資料大於1000的場合下使用插入排序,或者重複排序超過200資料項的序列。
6 氣泡排序(bubblesort)
氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每一個元素,使較大的資料下沉,較小的資料上升。它是o(n^2)的演算法。
7 交換排序(exchangesort)和選擇排序(selectsort)
這兩種排序方法都是交換方法的排序演算法,效率都是 o(n2)。在實際應用中處於和氣泡排序基本相同的地位。它們只是排序演算法發展的初級階段,在實際中使用較少。
8 基數排序(radixsort)
基數排序和通常的排序演算法並不走同樣的路線。它是一種比較新穎的演算法,但是它只能用於整數的排序,如果我們要把同樣的辦法運用到浮點數上,我們必須瞭解浮點數的儲存格式,並通過特殊的方式將浮點數對映到整數上,然後再對映回去,這是非常麻煩的事情,因此,它的使用同樣也不多。而且,最重要的是,這樣演算法也需要較多的儲存空間。
9 總結
下面是一個總的**,大致總結了我們常見的所有的排序演算法的特點。
排序法 平均時間 最差情形 穩定度 額外空間 備註
冒泡 o(n2) o(n2) 穩定 o(1) n小時較好
交換 o(n2) o(n2) 不穩定 o(1) n小時較好
選擇 o(n2) o(n2) 不穩定 o(1) n小時較好
插入 o(n2) o(n2) 穩定 o(1) 大部分已排序時較好
基數 o(logrb) o(logrb) 穩定 o(n)
b是真數(0-9),
r是基數(個十百)
shell o(nlogn) o(ns) 1
快速 o(nlogn) o(n2) 不穩定 o(nlogn) n大時較好
歸併 o(nlogn) o(nlogn) 穩定 o(1) n大時較好
堆 o(nlogn) o(nlogn) 不穩定 o(1) n大時較好
6樓:無心字
是歸併排序,我剛剛也做這個題目。
因為堆排序時間複雜度為n*logn,空間複雜度為1,是不穩定排序,適合較多情況;
而歸併排序的時間複雜度為n*logn,空間複雜度為n,是穩定排序。
快速排序的時間複雜度為n,空間複雜度最好的情況是logn,最壞的情況是n^2,是不穩定的排序方法。(書本原話)。
7樓:慶純
堆排序 n*logn 時間在這裡比較優 不過穩定性差快排 o(nlogn),最壞情況為o(n^2)。在實際應用中,快速排序的平均時間複雜度為o(nlogn)。
比較均衡
直接插入排序,簡單選擇排序 n^2
希爾排序和基數排序 不太瞭解
空間的話 個人認為是一樣的 因為你要用同樣的陣列去存 只是存的順序不同罷了
時間的話 100w以內 快排 最優 100w以上 堆排的優越性就明顯出來了
所以一般快排就可以滿足
排序演算法高手幫忙選一種最快的排序方法
記憶體排序演算法中最常用的演算法是快速排序演算法,時間複雜度是onlogn,其它的幾個演算法,如插入排序 堆排序的時間複雜性都是這個值。正常排序問題可以用堆排序,或者快排序,但這些演算法實際上都是在資料佇列已知的情況下的演算法,你實際需要的是一個記錄插入效率較高的演算法,插入排序應該也不錯的。當然也...
索書號怎麼排序索書號怎麼排序
其索書號是d452.62 4052。前面的部分是中國圖書館圖書分類法的分類號,其中,d 表示 政治 法律 大類,後面的數字是細分的小類。後面的數字應該是表示這種書是該圖書館的 政治法律 類圖書的第4052種。向圖書館借書時一定要把索書號寫正確 清楚而完整。圖書館的藏書排架方法 讀者借書時一定會發現在...
excel排序時是按資料的數字排序,怎麼解決
1 首先我們開啟excel軟體,準備要進行排序的資料2 然後新建一個排序列,在第二個單元格輸入如下圖所示的rank公式3 接下來拖住第二個單元格的右下角往下拉就會得到所有的排序結果4 最後我們還可以更改rank公式的排序方式,只需要變更第三個引數的值即可 首先選中整列,單擊右鍵,選中設定單元格格式 ...