pascal 隨機快排

2025-01-06 05:00:17 字數 3629 閱讀 5320

1樓:mcg_泯翌

簡單看了下,你的程式有幾處問題。

1)麻煩, 根本不需要將陣列傳入過程中,如果n很大的話這樣做棧會直接爆掉。 所以將快排中的x改為a直接排就好。

2)隨機化問題, 排序區間是[r,l] ,而random(l-r)+1的區間是[1,l-r],所以 y:=x[random(l-r)+1]; 應該改為 y:=x[random(l-r)+1+r];

完畢, 謝謝。

2樓:網友

將y:=x[random(l-r)+1];改為y:=x[random(l-r)+r];

因為你要取的數是在[r..l]這個區間內的。

pascal隨機化快排 randomize的問題

3樓:我最愛諸葛亮

好吧,關於這個問題,高中搞oi的時候,有一次做一套noip模擬題,就要用到快排,但是資料有點大,普通的會超時一點點,那麼怎麼優化呢?老師說加個randomize就行了,後來又一次,還是快排,還是超一點點掛,為什麼呢?因為有的同學寫到過程裡了。

randomize其實就是個隨機種子生成,所以在主程式里加乙個就可以了,在過程里加,呼叫太多了,會有細微影響。然後最好還是加乙個,不然的話生成的隨機數其實不能算真正的隨機數,好像是跟系統時間有關係。好久沒碰過這些了,有不對的歡迎指正。

4樓:網友

在主程式裡用就可以了,randomize只是說明random函式可以用了由於快排是遞迴演算法,用多了其實是會對程式效率造成影響,至於其他錯誤,我不得而知。

5樓:蚊子死神

都可以 不過一般都在主程式裡面使用 我沒有在過程中使用過。

最後一句話是對的。

什麼是隨機快速排序

6樓:福喜

隨機選擇快速排序是一種比較常見的優化快速排序的方法,即隨機選取乙個元素作為主元,而不是像普通快速排序那樣選取第乙個元素作為主元,這種情況下雖然最壞情況仍然是o(n^2),但最壞情況不再依賴於輸入資料,而是由於隨機函式取值不佳。

實際上,隨機化快速排序得到理論最壞情況的可能性僅為1/(2^n)。所以隨機化快速排序可以對於絕大多輸入資料達到o(nlogn)的期望時間複雜度。

pascal隨機快排中 一些問題。 急急急~!!

7樓:聽不清啊

問題一:這裡i=j時,雖然a[i]與a[j]已不需要交換,但是仍需要執行 inc(i);dec(j); 這二句,僅是多交換 了一次而已,寫成《的話,還要就i=j時的情況多寫一段,為省事(提高**的可讀性,簡化**)就這樣寫了。

問題二:為了不輸出多餘的空格,一般就採用這樣的方法。

或者是:for i:=1 to n-1 do write(a[i],' '); writeln(a[n]);一般總是以換行結束)

問題三:一般只要乙個就夠了,這是不自信或者說是增加可靠性?甚至不用readln;當要檢視時,直接按alt+f5就可以了。

快速排序怎樣隨機化

8樓:網友

procedure qsort(l,r:integer);

var i,j,x,t:longint;

begini:=l;j:=r;x:=a[random(r-l+1)+l];

repeat

while a[i]x do dec(j);

if i<=j then begin

t:=a[i];

a[i]:=a[j];

a[j]:=t;

inc(i);

dec(j);

end;until i>j;

if il then qsort(l,j);

end;這是我編的快排過程。

是隨機啊 如果一直是1,n-1的劃分(就是最差情況,不二分)就成o(n^2)的演算法了。

就起不到快排的作用了。

pascal 快排 用幾個數來給我說明一下 幾種方法都要

9樓:匿名使用者

pascal中的快排就是選取乙個基準元素,將區間內的每乙個數和基準元素比較,大的放右邊,小的放左邊(察備可隨意調控),給你乙個參考程式。(程式不唯一,只要知道演算法即可自由編寫,這裡我給出的是我習慣的一種編寫方式)

var n,i,j:integer;

a:array[1..maxint] of integer;

procedure qsort(l,r:integer);

var i,j,k:integer;

begink:=a[l];

i:=l;j:=r;

repeat

while (a[j]>=k) and (i5 所以dec(j);

此時j指向1,因為1<5 所以將a[j]的值賦給a[i],同時inc(i)

此時序列為 1 10 3 1 9

現在i指向10,因為a[i]>k 即10>5 所以a[i]的值賦給a[j]同時dec(j),此時序列為 1 10 3 10 9

現在j指向3,因為a[j]此時序列為 1 3 3 10 9

因為i=j所以 退出了repeat迴圈,現在將k的值賦給a[i]即完成這一輪的快排。

不知道我這樣說你明白了沒有,如果沒有答腔明白就直接把程式粘到pascal裡,然後用單步除錯看看,會很直觀的看出快排的思想。整體來說,快排就是不斷的縮小區間,確定某乙個值在整個序列中的位置。然而快排的時間效率是很高的,為o(n*log2 n).

是所有排序敗舉毀中最快的,所以在學習pascal的時候,運用最多最多的排序方法就是快排。

呵呵,上面一段可能有點點難以理解,不過只要你看懂了快排的程式就應該問題不大了。

10樓:匿名使用者

二分法:步驟:1.分解;2.解決;3.合併。

例:p[1..10]=

隨機選取一鋒遊個:如銀並銷65

分解成3部分,即小於65的和大於65的。

在對小於65的與大於65的進行排序。

需要蔽昌**的話說一下。

pascal中兩種快排 那個更優

11樓:網友

只從**來看,時間複雜度是一樣的。

主要區別是比較的時候,前一種以數列的中間乙個作為關鍵資料,後一種卻是把第乙個作為關鍵資料。

實際情況下,如果排序前數列近似於有序,那麼後一種效率低些,否則效率是差不多的。

12樓:網友

第一種啊。

第一種在pascal裡面就有的,推薦用的方法。

pascal 中,字串怎麼快排啊?按字典中的順序

13樓:匿名使用者

你以為是pascal自帶字串比較啊?樓上完全不符責任!!對於快排嘛、、貌似沒有,至少要在o(n^3)下出結果(可以用冒泡,應該是最簡單的了,因為字串太長,不能把26進位化成10進位的整數、、就只有不停地用兩個相鄰的字串碼衫進行簡塵比較,再交換、、)也可以用n關鍵字排序,把每一位的字母化成整數陣列:

array[1..length(st),1..n] of shortint;就可以瞭然後對每一位依次排序、、不過建議使用冒泡,因為快排編出來的程式**很長,優攔模禪化起來也很麻煩、、

魔獸世界隨機本排本跟什麼相關?GS嗎

確實是跟你的裝備有關。但是注意,系統考量的不僅僅是你身上的裝備gs。它會偵測到你銀行裡存的更高階的裝備。系統會智慧得對隊伍進行配對,5名隊友的gs一般都會差不多。另外,還有裝備門檻。如果你的gs過低,對於某些難度比較高的5人副本 比如英雄模式的倒影大廳 你排上隊的機率會比較低。另外,系統也會盡量減少...

魔獸世界15我排隨機為什麼提示我沒有完成所需的任務

你玩的是狼人吧?狼人必須做完所有的新手任務,然後把你傳送到精靈的主城達拉蘇斯以後,才可以排隨機副本 一 你確定你把fb的入口地圖開了 ctm的隨機本要求你把地圖踩一遍 二 有的地圖是要一系列任務才能進的 而像新三本 你是要先去洪爐 再去礦坑 再是大廳的 我魔獸新練的地精15級了 但是排不了隨機副本 ...

WOW不夠裝等排的隨機本可以從入口進去的嗎

可以,但是你只能自己找人組隊了,無法使用組隊系統。如果不是認識的朋友的話,這年頭沒什麼人願意自己組隊了,還得自己跑過去,麻煩得很。不可以 你進去他是普通本 還要開團 才能進 因為他是你裝備夠了才能自動找個個伺服器隊友 你裝備不夠系統預設為 那些隨機的隊友不會選擇你的 差不多就這個意思 我不知道你裝備...