说明:很简答的优化,却有很多人容易在面试时候栽在这个简单的问题上。
“冒泡排序”在面试中是很容易被问到的排序算法,也是最简单的排序算法,当被问到,“冒泡排序怎么优化?”,很多人就懵了,冒泡还能优化?答案是可以的。
但是,在对50000个随机数进行测试中,发现,优化的冒泡和一般的冒泡在性能上几乎一样。
于是又测试了25000有序25000无序的50000个随机数,优化的冒泡确实能快一些。
//通俗冒泡 22216ms(随机) 14650ms(前半有序) 19977ms(后半有序)
//优化冒泡 21238ms(随机) 11983ms(前半有序) 16607ms(后半有序)
1. 这是一般的冒泡排序。
1 /// <summary>
2 /// 通俗冒泡
3 /// </summary>
4 public static void BubbleSortCommon(int[] arr)
5 {
6 int temp;
7 int len = arr.Length - 1;
8 for (int i = 0; i < len; i++)
9 {
10 for (int j = 0; j < len - i; j++)
11 {
12 if (arr[j] > arr[j + 1])
13 {
14 temp = arr[j];
15 arr[j] = arr[j + 1];
16 arr[j + 1] = temp;
17 }
18 }
19 }
20 }
2. 这是优化后的冒泡排序。仅仅加了一个标识,相对于通俗的冒泡排序,却能更好地处理已经排好序或者几乎排好序的数组,避免做无用功。
1 /// <summary>
2 /// 优化冒泡
3 /// </summary>
4 public static void BubbleSortOptimize(int[] arr)
5 {
6 int flag = 0;
7 int len=arr.Length-1;
8 int temp;
9 while (flag == 0)
10 {
11 flag = 1;
12 for (int i = 0; i < len; i++)
13 {
14 if (arr[i] > arr[i + 1])
15 {
16 temp = arr[i];
17 arr[i] = arr[i + 1];
18 arr[i + 1] = temp;
19 flag = 0;
20 }
21 }
22 len--;
23 }
24 }