Skip to content

Commit 66dda14

Browse files
committed
Chapter 02 Bubble Sort optimized implementation C++ version bug fixed.
1 parent 2e90fff commit 66dda14

File tree

1 file changed

+56
-11
lines changed
  • 02-Sorting-Basic/Course Code (C++)/Optional-01-Bubble-Sort

1 file changed

+56
-11
lines changed

02-Sorting-Basic/Course Code (C++)/Optional-01-Bubble-Sort/main.cpp

Lines changed: 56 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,36 +7,48 @@
77
using namespace std;
88

99

10+
// 我们的第一版bubbleSort
1011
template<typename T>
1112
void bubbleSort( T arr[] , int n){
1213

1314
bool swapped;
14-
//int newn; // 理论上,可以使用newn进行优化,但实际优化效果较差
1515

1616
do{
1717
swapped = false;
18-
//newn = 0;
1918
for( int i = 1 ; i < n ; i ++ )
2019
if( arr[i-1] > arr[i] ){
2120
swap( arr[i-1] , arr[i] );
2221
swapped = true;
2322

24-
// 可以记录最后一次的交换位置,在此之后的元素在下一轮扫描中均不考虑
25-
// 实际优化效果较差,因为引入了newn这个新的变量
26-
//newn = n;
2723
}
2824

29-
//n = newn;
30-
31-
// 优化,每一趟Bubble Sort都将最大的元素放在了最后的位置
32-
// 所以下一次排序,最后的元素可以不再考虑
33-
// 理论上,newn的优化是这个优化的复杂版本,应该更有效
34-
// 实测,使用这种简单优化,时间性能更好
25+
// 优化, 每一趟Bubble Sort都将最大的元素放在了最后的位置
26+
// 所以下一次排序, 最后的元素可以不再考虑
3527
n --;
3628

3729
}while(swapped);
3830
}
3931

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+
4052
int main() {
4153

4254
int n = 20000;
@@ -47,14 +59,17 @@ int main() {
4759
int *arr1 = SortTestHelper::generateRandomArray(n,0,n);
4860
int *arr2 = SortTestHelper::copyIntArray(arr1, n);
4961
int *arr3 = SortTestHelper::copyIntArray(arr1, n);
62+
int *arr4 = SortTestHelper::copyIntArray(arr1, n);
5063

5164
SortTestHelper::testSort("Selection Sort", selectionSort, arr1, n);
5265
SortTestHelper::testSort("Insertion Sort", insertionSort, arr2, n);
5366
SortTestHelper::testSort("Bubble Sort", bubbleSort, arr3, n);
67+
SortTestHelper::testSort("Bubble Sort 2", bubbleSort, arr4, n);
5468

5569
delete[] arr1;
5670
delete[] arr2;
5771
delete[] arr3;
72+
delete[] arr4;
5873

5974
cout<<endl;
6075

@@ -67,14 +82,44 @@ int main() {
6782
arr1 = SortTestHelper::generateNearlyOrderedArray(n, swapTimes);
6883
arr2 = SortTestHelper::copyIntArray(arr1, n);
6984
arr3 = SortTestHelper::copyIntArray(arr1, n);
85+
arr4 = SortTestHelper::copyIntArray(arr1, n);
7086

7187
SortTestHelper::testSort("Selection Sort", selectionSort, arr1, n);
7288
SortTestHelper::testSort("Insertion Sort", insertionSort, arr2, n);
7389
SortTestHelper::testSort("Bubble Sort", bubbleSort, arr3, n);
90+
SortTestHelper::testSort("Bubble Sort 2", bubbleSort, arr4, n);
7491

7592
delete[] arr1;
7693
delete[] arr2;
7794
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+
78123

79124
return 0;
80125
}

0 commit comments

Comments
 (0)