7
7
using namespace std ;
8
8
9
9
10
+ // 我们的第一版bubbleSort
10
11
template <typename T>
11
12
void bubbleSort ( T arr[] , int n){
12
13
13
14
bool swapped;
14
- // int newn; // 理论上,可以使用newn进行优化,但实际优化效果较差
15
15
16
16
do {
17
17
swapped = false ;
18
- // newn = 0;
19
18
for ( int i = 1 ; i < n ; i ++ )
20
19
if ( arr[i-1 ] > arr[i] ){
21
20
swap ( arr[i-1 ] , arr[i] );
22
21
swapped = true ;
23
22
24
- // 可以记录最后一次的交换位置,在此之后的元素在下一轮扫描中均不考虑
25
- // 实际优化效果较差,因为引入了newn这个新的变量
26
- // newn = n;
27
23
}
28
24
29
- // n = newn;
30
-
31
- // 优化,每一趟Bubble Sort都将最大的元素放在了最后的位置
32
- // 所以下一次排序,最后的元素可以不再考虑
33
- // 理论上,newn的优化是这个优化的复杂版本,应该更有效
34
- // 实测,使用这种简单优化,时间性能更好
25
+ // 优化, 每一趟Bubble Sort都将最大的元素放在了最后的位置
26
+ // 所以下一次排序, 最后的元素可以不再考虑
35
27
n --;
36
28
37
29
}while (swapped);
38
30
}
39
31
32
+
33
+ // 我们的第二版bubbleSort,使用newn进行优化
34
+ template <typename T>
35
+ void bubbleSort2 ( T arr[] , int n){
36
+
37
+ int newn; // 使用newn进行优化
38
+
39
+ do {
40
+ newn = 0 ;
41
+ for ( int i = 1 ; i < n ; i ++ )
42
+ if ( arr[i-1 ] > arr[i] ){
43
+ swap ( arr[i-1 ] , arr[i] );
44
+
45
+ // 记录最后一次的交换位置,在此之后的元素在下一轮扫描中均不考虑
46
+ // newn = ;
47
+ }
48
+ n = newn;
49
+ }while (newn > 0 );
50
+ }
51
+
40
52
int main () {
41
53
42
54
int n = 20000 ;
@@ -47,14 +59,17 @@ int main() {
47
59
int *arr1 = SortTestHelper::generateRandomArray (n,0 ,n);
48
60
int *arr2 = SortTestHelper::copyIntArray (arr1, n);
49
61
int *arr3 = SortTestHelper::copyIntArray (arr1, n);
62
+ int *arr4 = SortTestHelper::copyIntArray (arr1, n);
50
63
51
64
SortTestHelper::testSort (" Selection Sort" , selectionSort, arr1, n);
52
65
SortTestHelper::testSort (" Insertion Sort" , insertionSort, arr2, n);
53
66
SortTestHelper::testSort (" Bubble Sort" , bubbleSort, arr3, n);
67
+ SortTestHelper::testSort (" Bubble Sort 2" , bubbleSort, arr4, n);
54
68
55
69
delete[] arr1;
56
70
delete[] arr2;
57
71
delete[] arr3;
72
+ delete[] arr4;
58
73
59
74
cout<<endl;
60
75
@@ -67,14 +82,44 @@ int main() {
67
82
arr1 = SortTestHelper::generateNearlyOrderedArray (n, swapTimes);
68
83
arr2 = SortTestHelper::copyIntArray (arr1, n);
69
84
arr3 = SortTestHelper::copyIntArray (arr1, n);
85
+ arr4 = SortTestHelper::copyIntArray (arr1, n);
70
86
71
87
SortTestHelper::testSort (" Selection Sort" , selectionSort, arr1, n);
72
88
SortTestHelper::testSort (" Insertion Sort" , insertionSort, arr2, n);
73
89
SortTestHelper::testSort (" Bubble Sort" , bubbleSort, arr3, n);
90
+ SortTestHelper::testSort (" Bubble Sort 2" , bubbleSort, arr4, n);
74
91
75
92
delete[] arr1;
76
93
delete[] arr2;
77
94
delete[] arr3;
95
+ delete[] arr4;
96
+
97
+ cout<<endl;
98
+
99
+
100
+ // 测试3 测试完全有序的数组
101
+ // 对于完全有序的数组,冒泡排序法也将成为O(n)级别的算法
102
+ swapTimes = 0 ;
103
+ n = 10000000 ; // 由于插入排序法和冒泡排序法在完全有序的情况下都将成为O(n)算法
104
+ // 所以我们的测试数据规模变大,为1000,0000
105
+ cout<<" Test for ordered array, size = " << n << endl;
106
+
107
+ arr1 = SortTestHelper::generateNearlyOrderedArray (n, swapTimes);
108
+ arr2 = SortTestHelper::copyIntArray (arr1, n);
109
+ arr3 = SortTestHelper::copyIntArray (arr1, n);
110
+ arr4 = SortTestHelper::copyIntArray (arr1, n);
111
+
112
+ // 在这种情况下,不再测试选择排序算法
113
+ // SortTestHelper::testSort("Selection Sort", selectionSort, arr1, n);
114
+ SortTestHelper::testSort (" Insertion Sort" , insertionSort, arr2, n);
115
+ SortTestHelper::testSort (" Bubble Sort" , bubbleSort, arr3, n);
116
+ SortTestHelper::testSort (" Bubble Sort 2" , bubbleSort, arr4, n);
117
+
118
+ delete[] arr1;
119
+ delete[] arr2;
120
+ delete[] arr3;
121
+ delete[] arr4;
122
+
78
123
79
124
return 0 ;
80
125
}
0 commit comments