算法-冒泡排序
2011-10-31 21:04 imyang 阅读(233) 评论(0) 编辑 收藏 举报冒泡排序的原理:简单的说,就是对数组里面的数字进行两两比较,较大的数不断地被交换上去,就像冒泡一样。每进行一轮排序,就是把最大的数找出来。
下面是实现算法一:
public void BubbleSort(int[] numbers) { int temp; for (int i = 0; i < numbers.Length - 1; i++) { for (int j = 0; j < numbers.Length - 1; j++) { if (numbers[j] > numbers[j + 1]) { temp = numbers[j]; numbers[j] = numbers[j + 1]; numbers[j + 1] = temp; } } } }
上面的实现方式是不管哪种情况,都要比较每2个数字,即比较n*n次。即使前面几轮的排序已经把较大的数找出来,后面的排序依然会对这些数进行比较,但实际上并不需要了。
见优化后的算法二:
public void BubbleSort(int[] numbers) { int temp; for (int i = numbers.Length - 2; i > 0; i--) { for (int j = 0; j < i; j++) { if (numbers[j] > numbers[j + 1]) { temp = numbers[j]; numbers[j] = numbers[j + 1]; numbers[j + 1] = temp; } } } }
这种实现方式是保持外循环次数不变的情况下,减小内循环的范围,如果已经得到较大的数,则不需要比较。这种情况,需要比较n(n-1)/2次,是不是还可以在优化呢,比如说,数组本来就是排好序的,这时候我们再不停地进行比较就比较多余了。
见优化后的算法三:
public void BubbleSort(int[] numbers) { int temp; bool flag = false; //判断是否进行过数字的比较 for (int i = numbers.Length - 2; i > 0; i--) { //从第二轮比较开始,如果前面没有进行过比较,那么该数组是排好序的,跳出循环 if (!flag && i < numbers.Length - 2) { return; } for (int j = 0; j < i; j++) { if (numbers[j] > numbers[j + 1]) { temp = numbers[j]; numbers[j] = numbers[j + 1]; numbers[j + 1] = temp; flag = true; } } } }
改进后的算法,最好的情况下只需要进行一轮的排序,比较n次,最坏的情况也同算法二,比较n(n-1)/2次。
小结:冒泡排序是比较简单的排序算法,容易理解、编程,而且比较稳定,相等数字的相对位置是不会变的。