快速排序法pascal

時間 2022-04-09 10:13:41

1樓:幾夢絲兒

快速排序是對氣泡排序的一種改進。它的基本思想是:通過一躺排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一不部分的所有資料都要小,然後再按次方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

假設要排序的陣列是a[1]……a[n],首先任意選取乙個資料(通常選用第乙個資料)作為關鍵資料,然後將所有比它的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一躺快速排序。一躺快速排序的演算法是:

1)、設定兩個變數i、j,排序開始的時候i:=1,j:=n;

2)以第乙個陣列元素作為關鍵資料,賦值給x,即x:=a[1];

3)、從j開始向前搜尋,即由後開始向前搜尋(j:=j-1),找到第乙個小於x的值,兩者交換;

4)、從i開始向後搜尋,即由前開始向後搜尋(i:=i+1),找到第乙個大於x的值,兩者交換;

5)、重複第3、4步,直到i>j;

詳細過程舉例如下:

原序: [26 5 37 1 61 11 59 15 48 19]

一: [19 5 15 1 11] 26 [59 61 48 37]

二: [11 5 15 1] 19 26 [59 61 48 37]

三: [1 5] 11 [15] 19 26 [59 61 48 37]

四: 1 5 11 [15] 19 26 [59 61 48 37]

五: 1 5 11 15 19 26 [59 61 48 37]

六: 1 5 11 15 19 26 [37 48] 59 [61]

七: 1 5 11 15 19 26 37 48 59 [61]

八: 1 5 11 15 19 26 37 48 59 61

快速排序法是所有排序方法中速度最快、效率最高的方法。程式如下:

var a:array[0..10] of integer;

n:integer;

procedure qsort(l,r:longint);

var i,j,m:longint;

begin

m:=a[l];

i:=l;

j:=r;

repeat

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

if i<=j then begin

a[0]:=a[i];

a[i]:=a[j];

a[j]:=a[0];

inc(i);

dec(j);

end;

until i>j;

if l

if i

end;

begin

for n:=1 to 10 do read(a[n]);

qsort(1,10);

for n:=1 to 10 do write(a[n]:4);

end.

2樓:匿名使用者

program hongweikai;

varn,i:longint;

a:array[1..400000] of longint;

procedure kp(l,r:longint);

vari,j,x,t:longint;

begin

i:=l;

j:=r;

x:=a[(l+r) div 2];

repeat

while a[i]>x do i:=i+1;

while a[j]j;

if i

kp(i,r);

if l

kp(l,j);

end;

begin

for i:=1 to 10 do

read(a[i]);

kp(1,10);

for i:=1 to 10 do

write(a[i],' ');

end.

3樓:匿名使用者

插入排序

var n,i,j:longint;

a:array[0..10000]of longint;

begin

readln(n);

for i:=1 to n do read(a[i]);

for i:=2 to n do begina[0]:=a[i];j:=i-1;

while (a[0]0) do begina[j+1]:=a[j];

j:=j-1;

end;

a[j+1]:=a[0];

end;

for i:=1 to n do write(a[i]:4);

end.

歸併排序(求逆序對)

var a,x,y,z,b:array[1..100000]of longint;

n,i:longint;

ans:int64;

procedure merge(l,mid,r:longint);

var i,j,k:longint;

begin

for i:=l to mid do x[i]:=a[i];

for i:=mid+1 to r do y[i]:=a[i];

i:=l;

j:=mid+1;

k:=l-1;

while k=y[j])or(j>r))and(i<=mid) then begin

inc(k); z[k]:=x[i]; inc(i);

endelse begin

inc(k); z[k]:=y[j]; inc(j);

ans:=ans+mid-i+1;

end;

end;

for i:=l to r do a[i]:=z[i];

end;

procedure sort(l,r:longint);

var mid:longint;

begin

mid:=(l+r)shr 1;

if lx do inc(i);

while b[j]j;

if il then qsort(l,j);

end;

begin

readln(n);

for i:=1 to n do read(b[i]);

for i:=1 to n do read(a[i]);

qsort(1,n);

sort(1,n);

writeln(ans);

end.

快速排序

var a:array[1..10000]of longint;

n,i:longint;

procedure asd(l,r:longint);

var t,m,i,j:longint;

begin

i:=l;j:=r;

m:=a[(l+r)div 2];

repeat

while ma[j] 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 j>l then asd(l,j);

if ia[j+1] then begint:=a[j];

a[j]:=a[j+1];

a[j+1]:=t;

end;

for i:=1 to n do write(a[i]:4);

end.

pascal快速排序

五 快速排序 由小到大 思想 中級本p230舉例排序過程 設i為當前表頭指標,j為當前表的尾指標,x為當前表的第乙個元素,首先從當表前的最後j位置向前找到乙個比x小的元素,此時將找到的小數放到當前表第一元素位置,i指標下移並向後找乙個元素比x大的元素,此時將找到的大數放到當前表的j位置,不斷按此方法...

用氣泡排序法對陣列排序,用氣泡排序法對乙個陣列排序

include define n 15 int main i,j,t 陣列已有n個資料for i 0 ia j 1 若相信的元素大小順序不對,就交換 for i 0 i printf n return 0 main printf the sorted numbers n for i 0 i 10 i...

誰有快速排序的c語言實現啊,誰有快速排序的C語言實現啊

include typedef int infotype define n 10 假設的檔案長度,即待排序的記錄數目 typedef int keytype 假設的關鍵字型別 typedef struct rectype typedef rectype seqlist n 1 seqlist為順序表...

氣泡排序法沒看懂

寫幾個無序的數字,按照程式一步一步來,你就知道了,而且印象深刻,絕對忘不了!那個大小比較是說,如果前乙個數比後乙個小,則交換位置 假設有n個數 n就是上邊程式中的arr.length 第一次氣泡排序 這時候i 0 最大的數就排在了最後。所以第二次 這時候i 1 排序的時候就從第乙個開始比較到倒數第二...

什麼是氣泡排序法,什麼是氣泡排序演算法

氣泡排序 英語 bubble sort 是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢 浮 到數列的頂端。氣泡排序對...