1. 程式人生 > >遞迴與分治--快速排序

遞迴與分治--快速排序

#include<cstdio>
#include<algorithm>
using namespace std;
int Partition(int a[], int s, int t) //劃分演算法
{ 
	int i = s, j = t;
	int tmp = a[s];			 //用序列的第1個記錄作為基準
	while (i != j)			 //從序列兩端交替向中間掃描,直至i=j為止
	{ 
		while (j > i && a[j] >= tmp) 
			j--; 				//從右向左掃描,找第1個關鍵字小於tmp的a[j]
		a[i] = a[j]; 			//將a[j]前移到a[i]的位置
		while (i < j && a[i] <= tmp) 
			i++; 			//從左向右掃描,找第1個關鍵字大於tmp的a[i]
		a[j] = a[i]; 			//將a[i]後移到a[j]的位置
	}
	a[i] = tmp;
	return i;
}
void QuickSort(int a[], int s, int t)		//對a[s..t]元素序列進行遞增排序
{ 
	if (s < t) 				//序列內至少存在2個元素的情況
	{ 
		int i = Partition(a, s, t);
		QuickSort(a, s, i-1); 		//對左子序列遞迴排序
		QuickSort(a, i+1, t); 		//對右子序列遞迴排序
	}
}
int main()
{
	int a[] = {1,3,5,7,6,2,4,8,10,9};
	int length = sizeof(a) / sizeof(int);	//計算出陣列的長度 -- sizeof計算的是位元組長度
	QuickSort(a, 0, length);
	for(int i = 0; i < length; i++)
	{
		printf("%d%c",a[i], i == length-1?'\n':' ');
	}
	return 0;
}