快速排序 quicksort

2021-04-19 22:26:11 字數 1765 閱讀 4465

快速排序(quicksort)是分治法的典型例子,它的主要思想是將乙個待排序的陣列以陣列的某乙個元素x為軸,使這個軸的左側元素都比x大,而右側元素都比x小(從大到小排序)。然後以這個x在變換後陣列的位置i分為左右兩個子陣列,再分別進行快速排序,直到子陣列中只有乙個元素為止。

快速排序演算法如下

void

quicksort(

inta, 

intp, 

intr)

}其中partition函式將得到x所在的位置i(在這裡總以陣列的最後乙個元素為軸)。

intpartition(

inta, 

intp, 

intr)

}swap(

&a[i +1

], &

a[r]);

returni +

1;}

由於總是選擇陣列的最後乙個元素做為軸,因此可能出現x的左邊為n - 1或接近n - 1個元素,而右邊沒有元素,或元素很少的情況,即x最大或比較大。這樣使quicksort將出現最壞的情況,也就是時間複雜度為o(n^2)。因此partition可以採用隨機方式得到軸x的位置i。 這樣它的平均情況是非常好的(時間複雜度為o(nlogn)),也就是說,最壞情況很難出現。

intnew_random(

intmin, 

intmax)

intrandomize_partition(

inta, 

intp, 

intr)

完整的**如下

#include 

<

stdio.h

>

#include 

<

stdlib.h

>

void

out_int_array(

intdata, 

intn)

printf("/n

");}void

swap(

int*

a, int*b)

intnew_random(

intmin, 

intmax)

intpartition(

inta, 

intp, 

intr)

}swap(

&a[i +1

], &

a[r]);

returni +

1;}void

quicksort(

inta, 

intp, 

intr)

}intrandomize_partition(

inta, 

intp, 

intr)

void

randomize_quicksort(

inta, 

intp, 

intr)

}intmain()

;intb =

;out_int_array(a, 7);

quicksort(a, 0, 

6);out_int_array(a, 7);

printf(

"--------------------------randomize-----------------------------/n

");   

srand((unsigned)time( null ));

randomize_quicksort(b, 0, 

6);out_int_array(b, 7);

return0;

}

快速排序 QuickSort

快速排序通常用於排序的最佳的使用選擇,其期望執行時間為 o nlgn 能夠進行就地排序。最壞執行時間為 o n 2 演算法描述 分解 divide 陣列 a beg end 被劃分為兩個子陣列 a beg mid 1 和a mid 1 end 使得a beg mid 1 中的資料都小於 a mid ...

快速排序 QuickSort

1,void quicksort int a,int low,int high 這個函式是排序的遞迴部分,mid就是已經確定的基準元素的位置。2,int partition int a,int low,int high 這個函式幹了兩件事 1 挑出來乙個基準元素 這裡選的是最後乙個作為基準 找它的正...

快速排序 QuickSort

1 演算法思想 快速排序是c.r.a.hoare於1962年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法 divide and conquermethod 1 分治法的基本思想 分治法的基本思想是 將原問題分解為若干個規模更小但結構與原問題相似的子問題。遞迴地解這些子問題,然後將...