最大最小值选择:
7 void Sort::findMaxMin(int a[], int &max, int &min, int size)
8 {
9 int i = 0;
10 if (size %2) {
11 max = min = a[0];
12 i = 1;
13 } else {
14 if (a[0] > a[1]) {
15 max = a[0];
16 min = a[1];
17 } else {
18 max = a[1];
19 min = a[0];
20 }
21 i = 2;
22 }
23 for (; i < size; i+=2) {
24 if (a[i] > a[i+1]) {
25 if (a[i] > max)
26 max = a[i];
27 if (min > a[i+1])
28 min = a[i+1];
29 } else {
30 if (a[i+1] > max)
31 max = a[i+1];
32 if (min > a[i])
33 min = a[i];
34 }
35 }
36 }
随机选择:
47 static int quickPartition(int a[], int first, int last)
48 {
49 int data = a[first];
50 int left = first, right = last;
51 while (left < right) {
52 while (left < right && a[right] >= data) right--;
53 a[left] = a[right];
54 while (left < right && a[left] < data) left++;
55 a[right] = a[left];
56 }
57 a[left] = data;
58 return left;
59 }
60
61
62 static int randomPartition(int a[], int first, int last)
63 {
64 srand((unsigned)time(NULL));
65 int i = rand() % (last- first + 1) + first;
66 int tmp = a[i];
67 a[i] = a[first];
68 a[first] = tmp;
69 cout<<i<<endl;
70 return quickPartition(a, first, last);
71 }
72
73
74 int Sort::randomSelect(int *a, int first, int last, int i)//i is the NO. i minum number in a[]
75 {
76 if (first == last)
77 return a[first];
78 int q= randomPartition(a, first, last);
79
80 int k = q - first + 1;
81 if (i == k) {
82 return a[q];
83 } else if ( i < k) {
84 return randomSelect(a, first, q-1, i);
85 }
86 else
87 {
88 return randomSelect(a, q+1, last, i - k);
89 }
90 }