分两种方式开始,其实际是一样的,都是把大的或者小的往另一侧推(为什么叫冒泡排序?)
列举数组包含元素n+1个(最后一个下表就是n了,这个应该都知道的)----------注意这里数组有n+1个元素
一从数组头开始比较
排序开始(从小到大排序) 第一轮
- 第0位与第1位比较,如果第0位大于第1位,则交换它们的位子,否则不处理(保证第1位大于第0位)
- 第1位与第2位比较,如果第1位大于第2位,则交换它们的位子,否则不处理(保证第2位大于第1位)
- ...
- 第n位与第n+1位比较,如果第n位大于第n+1位,则交换它们的位子,否则不处理(保证第n+1位大于第n位)
这算进过一轮比较,将最大的一位移动到了最后一位,第二轮比较就不考虑最后一个了 第二轮
- 第0位与第1位比较,如果第0位大于第1位,则交换它们的位子,否则不处理(保证第1位大于第0位)
- 第1位与第2位比较,如果第1位大于第2位,则交换它们的位子,否则不处理(保证第2位大于第1位)
- ...
- 第n-1位与第n位比较,如果第n-1位大于第n位,则交换它们的位子,否则不处理(保证第n位大于第n-1位)
总共需要 n轮才能比较完
二从数组尾开始
略
代码如下:
1 public static void BubbleSort(int[] array) 2 { 3 //外部循环控制要循环几轮 4 for (int i = 0; i < array.Length-1; i++) 5 { 6 //每次都从0位与第1位比较开始,不处理上一轮的最后一位,所以这里有个-i,因为下面比较j++,所以j不能为数组最后一位 7 for (int j = 0; j < array.Length-1-i; j++) 8 { 9 //这里说明把大的数往后面推,使得数组从小到大排序;改为<则将小的数往后推,使得数组从大到小排序 10 if (array[j] > array[j+1]) 11 { 12 int c = array[j]; 13 array[j] = array[j + 1]; 14 array[j + 1] = c; 15 } 16 } 17 } 18 }
我在网上还看到一种错误的代码:
1 public static void BubbleSort(int[] array) 2 { 3 for (int i = 0; i < array.Length - 1; i++) 4 { 5 //注意这里内循环处理不同 6 for (int j = i + 1; j < array.Length; j++) 7 { 8 int c = array[i]; 9 //这里是i位与j位比较 10 if (array[i] > array[j]) 11 { 12 array[i] = array[j]; 13 array[j] = c; 14 } 15 } 16 } 17 }
1这个可以实现排序(排序功能没问题)
2这不是冒泡排序
3这是选择排序的思想,选择排序下次来写了 -_-
总结
基本的冒泡排序就这样了,但是有比较明显的问题
如:数组元素: 9,1,2,3,4,5
这个数组在第一轮排序后变成 1,2,3,4,5,9 也就是变得有序了
但是冒泡排序还是会接着比较,发现问题,,,,那就优化它咯,不过是下次了,12点咯,睡觉!!!
内容来源于网络如有侵权请私信删除
- 还没有人评论,欢迎说说您的想法!