排序原理:
相邻两数两两比较,较大的放在数组最后
例如:4,8,7,5,3,1,2
第一次循环:将最大的数字8放在数组最后
第二次循环:将第二大的数字7放在数组最后
第三次循环:...........................
.......................................
.......................................
.......................................
最后一次循环:1,2,3,4,5,7,8
动图演示:
原版算法:
void bubble_sort(vector<int>& array) { int size = array.size(); for (int i = 0; i < size; i++) { for (int j = 0; j < size - i - 1; j++) { if (array[j]>array[j + 1]) { int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } } }
优化
如果上面代码中,里面一层循环在某次扫描中没有执行交换,则说明此时数组已经全部有序列,无需再扫描了。因此,增加一个标记,每次发生交换,就标记,如果某次循环完没有标记,则说明已经完成排序。
void bubblesort_1(vector<int>& array) { int size = array.size(); for (int i = 0; i < size; i++) { bool isExchanged = false; for (int j = 0; j < size - i - 1; j++) { if (array[j]>array[j + 1]) { int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; isExchanged = true; } } if (!isExchanged) break; } }