快速排序:
該方法的基本思想是:
1.先從數列中取出一個數作為基准數。
2.分區過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。
3.再對左右區間重復第二步,直到各區間只有一個數。
快速排序進一步挖掘就是挖坑和分治,這種方法比較實用簡單:
對挖坑填數進行總結
1.i =L; j = R; 將基准數挖出形成第一個坑a[i]。
2.j--由後向前找比它小的數,找到後挖出此數填前一個坑a[i]中。
3.i++由前向後找比它大的數,找到後也挖出此數填到前一個坑a[j]中。
4.再重復執行2,3二步,直到i==j,將基准數填入a[i]中。
很容易能得出代碼:
#include
#include
void quick_sort(int s[], int l, int r);
int main(void)
{
int a[10] = {20, 8,10,27,9,22,24,7,15,55};
int i;
quick_sort(a, 0, 9);
for(i = 0; i < 10; i++)
printf("%d ", a[i]);
return 0;
}
//快速排序
void quick_sort(int s[], int l, int r)
{
if (l < r)
{
//Swap(s[l], s[(l + r) / 2]); //將中間的這個數和第一個數交換
int i = l, j = r, x = s[l];
while (i < j)
{
while(i < j && s[j] >= x) // 從右向左找第一個小於x的數
j--;
if(i < j)
s[i++] = s[j];
while(i < j && s[i] < x) // 從左向右找第一個大於等於x的數
i++;
if(i < j)
s[j--] = s[i];
}
s[i] = x;
quick_sort(s, l, i - 1); // 遞歸調用
quick_sort(s, i + 1, r);
}
}