冒泡排序:
一种交换排序,基本思想是两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止
比如数组{9,1,5,8,3,7,6,2}
使用冒泡排序-->
第一轮 [1, 5, 8, 3, 7, 6, 2, 9]
第二轮 [1, 5, 3, 7, 6, 2, 8, 9]
第三轮 [1, 3, 5, 6, 2, 7, 8, 9]
第四轮 [1, 3, 5, 2, 6, 7, 8, 9]
第五轮 [1, 3, 2, 5, 6, 7, 8, 9]
第六轮 [1, 2, 3, 5, 6, 7, 8, 9]
第七轮 [1, 2, 3, 5, 6, 7, 8, 9]
第八轮 [1, 2, 3, 5, 6, 7, 8, 9]
第九轮 [1, 2, 3, 5, 6, 7, 8, 9]
每轮都会有一个之排序到正确位置;
冒泡排序的标准代码:
void BubbleSort(vector<int>& vec) { int n = vec.size(); for (int i = 0; i < n; ++i) { for (int j = n - 2; j >= i; --j) //注意j是从后往前循环 { if (vec[j] > vec[j + 1]) swap(vec[j], vec[j + 1]);//替换元素的方法 } } }
如数组 {2,1,3,4,5,6,7,8,9}
使用冒泡排序-->
第一轮 [1, 2, 3, 5, 6, 7, 8, 9]
第二轮 [1, 2, 3, 5, 6, 7, 8, 9]
第三轮 [1, 2, 3, 5, 6, 7, 8, 9]
第四轮 [1, 2, 3, 5, 6, 7, 8, 9]
第五轮 [1, 2, 3, 5, 6, 7, 8, 9]
第六轮 [1, 2, 3, 5, 6, 7, 8, 9]
第七轮 [1, 2, 3, 5, 6, 7, 8, 9]
第八轮 [1, 2, 3, 5, 6, 7, 8, 9]
第九轮 [1, 2, 3, 5, 6, 7, 8, 9]
可以看到,在序列基本有序的情况下,在第一次排序后就已经完全有序,但此时算法仍在不断的进行循环判断,这种无意义的循环判断明显的降低了效率,因此,为了减少这种无意义的判断,我们可以将算法作如下改进:
public static void BubbleSort(int[] vec) { int n = vec.length; boolean flag = true; for (int i = 0; i < n && flag; ++i) { flag = false; for (int j = 0; j <n-1-i; j++) { if (vec[j] > vec[j + 1]) { int temp = vec[j]; vec[j] = vec[j + 1]; vec[j + 1] = temp; flag = true; } } System.out.println(Arrays.toString(vec)); } }
结果如下:
可以看到明显的减少了无意义的循环判断