【演算法導論】7
阿新 • • 發佈:2018-12-20
快速排序
程式碼:
#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();
}