動機:
對於 Quick Sort 排序演算法(其加速在於軸的選擇),
再要求你寫個 C++ function,
要如何寫呢?!
說明:
利用 Code::Blocks 10.05 免費軟體,
再撰寫相關的程式即可達成要求, 程式碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 10
#define SWAP(x, y) { int t; t = x; x = y; y = t; }
using namespace std;
void quickSort(int[], int, int);
void printArray(int[]);
int main(void)
{
// 產生一個新的亂數數列
srand(time(NULL));
// 宜告10個數字之陣列, 並清空
int number[MAX] = {0};
// 產生 1-99 的亂數, 並取 10 個數字
for(int i = 0; i < MAX; i++)
number[i] = (rand() % 99) + 1;
printf("排序前:");
printArray(number);
// 執行 Quick Sort 演算法
quickSort(number, 0, MAX - 1);
printf("排序後:");
printArray(number);
return 0;
}
// Quick Sort algorithm
void quickSort(int number[], int left, int right)
{
if(left < right)
{
int s = number[ (left + right) / 2 ]; // 將軸s設定為中間的元素
int i = left - 1;
int j = right + 1;
while( 1 )
{
while( s > number[++i] ); // 向右找比s大的索引 i
while( s < number[--j] ); // 向左找比s小的索引 j
if( i >= j )
break; // 離開迴圈
SWAP( number[i], number[j] ); // 交換 索引i 與 j 兩處的值
}
quickSort( number, left, i - 1 ); // 對左邊進行遞迴
quickSort( number, j + 1, right ); // 對右邊進行遞迴
}
}
// 將陣列元素輸出
void printArray(int number[])
{
for(int i = 0; i < MAX; i++)
printf("%02d ", number[i]); // 表示右切齊最少印2位,不足處補0
printf("\n");
}
參攷: Algorithm Gossip: 快速排序法(二)
執行檔下載連結: https://docs.google.com/open?id=0B_4eUrknq7N1ZTY1NzMyYTgtODYzMS00NzhiLTk5OTYtMTZlNDA0NGI4OGU3
留言