1. 程式人生 > >【演算法導論】7

【演算法導論】7

快速排序

程式碼:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int partition(int a[], int p, int r)
{
	int t, i, j;
	/*隨機化
	int x = p + (rand() % (r - p));
	t = a[r];
	a[r] = a[x];
	a[x] = t;
	*/
	i = p - 1;
	for (j = p; j < r; j++)
		if (a[j] <= a[r])
			{
				i++;
				t =
a[i]; a[i] = a[j]; a[j] = t; } t = a[r]; a[r] = a[i + 1]; a[i + 1] = t; return i + 1; } void sort(int a[], int p, int r) { /*普通遞迴,對於<8,7,6,5,4,3,2,1>棧深度為8 if (p < r) { int q = partition(a, p, r); sort(a, p, q - 1); sort(a, q + 1, r); } */ /*尾遞迴,對相同陣列呼叫時,棧深度為5 while(p < r) { int q = partition(a, p, r); sort(a, p, q - 1); p = q + 1; } */
/*尾遞迴,且每次遞迴呼叫劃分時較短的子陣列,對相同陣列呼叫時,棧深度為2(Θ(lgn))*/ while (p < r) { int q = partition(a, p, r); if (q <= (p + r) / 2) { sort(a, p, q - 1); p = q + 1; } else { sort(a, q + 1, r); r = q - 1; } } } void main() { int n, i, a[30000]; scanf("%d", &n); for (i = 1; i <= n;
i++) scanf("%d", a + i); sort(a, 1, n); for (i = 1; i <= n; i++) { if (i % 30 == 0) printf("\n"); printf("%d ", a[i]); } getchar(); getchar(); }