用分治法實現快排

#include "stdio.h"  

/*

* 顯示數組

* 只顯示begin 到 end 下標間的數據到對應位置。

* 如,數組爲 13, 17, 12 並先後執行:

* show(array, 3, 0, 2);

* show(array, 3, 1, 2);

* show(array, 3, 1, 1);

* 會顯示爲:

* 13 17 12

* 17 12

* 17

*/

void show(int array[], long maxlen, int begin, int end)

{

int i = 0;


/* 不關心的數據用空格填充顯示 */

for (i = 0; i<begin; i++)

printf(" ");


for (i = begin; i <= end; i++)

printf("%4d", array[i]);


printf("\n");

}

/*

* 兩個數交換數值。

* 返回爲 1 時說明進行了交換。

* 返回爲 0 時說明兩個數值相同沒必要交換。

* 此返回值可以用於只想打印結果變化的情況。

*/

int swap(int *i, int *j)

{

int temp;


if (*i == *j)

return 0;


temp = *i;

*i = *j;

*j = temp;


return 1;

}


/*

* 快速排序函數

* 此函數只會對begin下標(包括begin )和end(包括end)下標間的數據進行排序

*/

void quicksort(int array[], int maxlen, int begin, int end)

{

int i, j;


if (begin < end) {

/* 因爲開始值作爲基準值不用移動,所以需要比較的值是從 begin+1 開始 */

i = begin + 1;

j = end;


/*

* 此循環的作用:array[begin] 爲基準對 array[begin+1] 和 array[end]

* 之間的數進行初步分組,分組後的效果見循環後的描述

*

* 此處寫 while(i != j) 是等價的,因爲初始狀態 i<=j 且每次i和j的

* 相對變化值爲 1 所以不會出現 i>j的情況

*/

while (i < j) {

/* 如果當前值大於 array[begin],把當前值換到 j 指向的位置,換位後 j 下標前移 */

if (array[i] > array[begin]) {

if (swap(&array[i], &array[j]) == 1)

show(array, maxlen, begin, end); /* 只顯示begin 到 end 下標間的數據 */

j--;

}

/* 否則 i 下標向後移動,準備比較下一個數。*/

else

i++;

}

/*

* 在此時: i=j, array還沒有進行判斷處理

* 且 array[begin+1] ~ array[i-1] 都小於 array[begin]

* 且 array[i+1] ~ array[end] 都大於 array[begin]

*

* 接着: 對 array[begin] 和 array[i] 比較並處理

* 目的是判斷 array[i] 應該分在左組還是右組,

* 同時還要把 array[begin] 的值放在分割線位置。

*

* 如果 array[i] 的值大於 array[begin],則把 array[begin] 放在 i 前

* 也就是把 array[begin] 和 i 前的數換位

*/

if (array[i] > array[begin])

i--;


/* 把 array[begin] 放在 i 指向的位置 */

if (swap(&array[begin], &array[i]) == 1)

/* 只顯示begin 到 end 下標間的數據 */

show(array, maxlen, begin, end);


/* 再從分割線位置 i 分組分別排序 */

quicksort(array, maxlen, begin, i);

quicksort(array, maxlen, j, end);

}

}

int main(int argc, char* argv[])

{

int array[10] = { 49, 38, 65, 97, 48, 13, 27, 11, 56, 45 };

int maxlen = sizeof(array) / sizeof(int);


show(array, maxlen, 0, maxlen - 1); /* 打印初始順序 */

quicksort(array, maxlen, 0, maxlen - 1);

show(array, maxlen, 0, maxlen - 1); /* 打印最終結果 */

getchar();


return 0;

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章