标签:http color io ar for art div 问题 sp
前一篇文章讲到了选择枢纽元的几种方法,其实第二种是随机选择元素作为枢纽元。那么在这篇文章里就实现一个随机化排序。
算法与前面《算法导论》里的例子差不多,只是在调用分割Partition时加入一个随机数,具体可以参看程序。PowerBet
C语言代码为:
01 |
#include "stdio.h" |
02 |
#include "math.h" |
03 |
#include "stdlib.h" |
04 |
05 |
int num = 10; |
06 |
07 |
void swap( int *a, int *b) |
08 |
{ |
09 |
int tmp; |
10 |
tmp = *a; |
11 |
*a = *b; |
12 |
*b = tmp; |
13 |
} |
14 |
15 |
void PrintArray( int arr[]) |
16 |
{ |
17 |
int i; |
18 |
for (i=0; i < num; ++i) |
19 |
{ |
20 |
printf ( "%d " , arr[i]); |
21 |
} |
22 |
} |
23 |
24 |
int Partition( int *arr, int beg, int end) |
25 |
{ |
26 |
int j; |
27 |
int sentinel = arr[end]; |
28 |
int i = beg-1; |
29 |
for (j=beg; j <= end-1; ++j) |
30 |
{ |
31 |
if (arr[j] <= sentinel) |
32 |
{ |
33 |
i++; |
34 |
swap(&arr[i], &arr[j]); |
35 |
} |
36 |
} |
37 |
swap(&arr[i+1], &arr[end]); |
38 |
39 |
printf ( "\n排序过程:" ); |
40 |
PrintArray(arr); |
41 |
return i+1; |
42 |
} |
43 |
44 |
int RandomPartition( int *arr, int beg, int end) |
45 |
{ |
46 |
int i = beg + rand () % (end-beg+1); |
47 |
swap(&arr[i], &arr[end]); |
48 |
return Partition(arr, beg, end); |
49 |
} |
50 |
51 |
void RandomQuickSort( int *arr, int beg, int end) |
52 |
{ |
53 |
if (beg < end) |
54 |
{ |
55 |
int pivot = RandomPartition(arr, beg, end); |
56 |
printf ( "\n随机选择 arr[%d](%d)" , pivot, arr[pivot]); |
57 |
RandomQuickSort(arr, beg, pivot-1); |
58 |
printf ( "\n随机选择 arr[%d](%d)" , pivot, arr[pivot]); |
59 |
RandomQuickSort(arr, pivot+1, end); |
60 |
} |
61 |
} |
62 |
63 |
int main() |
64 |
{ |
65 |
int i; |
66 |
int arr[10]; |
67 |
68 |
srand ( time (0)); |
69 |
for (i=0; i < 10; i++) |
70 |
{ |
71 |
arr[i] = rand ()%100+1; |
72 |
//printf("%d ", rand()%100+1); |
73 |
} |
74 |
75 |
printf ( "初始数组:" ); |
76 |
PrintArray(arr); |
77 |
78 |
RandomQuickSort(arr, 0, num-1); |
79 |
80 |
printf ( "\n最后结果:" ); |
81 |
PrintArray(arr); |
82 |
83 |
return 0; |
84 |
} |
程序运行结果:
01 |
初始数组:79 36 68 39 10 96 59 60 84 21 |
02 |
排序过程:79 36 68 39 10 59 60 21 84 96 |
03 |
随机选择 arr[8](84) |
04 |
排序过程:21 10 36 39 79 59 60 68 [84] 96 |
05 |
随机选择 arr[2](36) |
06 |
排序过程:10 21 [36] 39 79 59 60 68 84 96 |
07 |
随机选择 arr[1](21) |
08 |
随机选择 arr[1](21) |
09 |
随机选择 arr[2](36) |
10 |
排序过程:10 21 [36] 39 79 59 60 68 84 96 |
11 |
随机选择 arr[3](39) |
12 |
随机选择 arr[3](39) |
13 |
排序过程:10 21 36 [39] 68 59 60 79 84 96 |
14 |
随机选择 arr[7](79) |
15 |
排序过程:10 21 36 39 60 59 68 [79] 84 96 |
16 |
随机选择 arr[6](68) |
17 |
排序过程:10 21 36 39 59 60 [68] 79 84 96 |
18 |
随机选择 arr[4](59) |
19 |
随机选择 arr[4](59) |
20 |
随机选择 arr[6](68) |
21 |
随机选择 arr[7](79) |
22 |
随机选择 arr[8](84) |
23 |
最后结果:10 21 36 39 59 60 68 79 [84] 96 |
24 |
Process returned 0 (0x0) execution time : 0.582 s |
25 |
Press any key to continue . |
一般来说随机选取枢纽元这种策略非常安全,除非随机数生成器有问题(这不像你所想象的那么罕见),因为随机的枢纽元不可能总在接连不断地产生劣质的分割。另一方面,随机数的生成一般是昂贵的,根本减少不了算法其余部分的平均运行时间。
比如上面程序的运行结果,可以看到,产生了不少随机数是对排序没有产生有效作用的,而产生这些随机数也耗费了不少时间。当然你也可以选择优化随机数生成器,这样又会引起更多的研究了。
标签:http color io ar for art div 问题 sp
原文地址:http://www.cnblogs.com/laoyangman/p/3970014.html