1 . 什么是冒泡排序?
网上查了点资料,也没有找到什么有用的概念,大致的意思都是 相邻的两个数两两做比较。根据相应的规则(比较大的往后放或比较小的往后放)放置两数的位置:
规则:大的数往后靠
比较前: 2,1
比较后: 1,2
2 . 实战
假设有这样一个数组
int arr[] ={ 2,5,1,4,3,6 }
冒泡排序是这样排的:
规则:小的往后靠
拿第一个数开始与其后面的做比较。
第一次比较:
2<5 true 所以 2 和 5 的位置变换
现在 arr是这样的
int arr[] = { 5,2,1,4,3,6 }
2<1 false 所以 2 和 1 的位置不变
int arr[] ={ 5,2,1,4,3,6 }
由于刚才的位置未放生变化,那就拿1与其后面的数继续比较
1<4 true 所以 1 和 4 的位置变换
现在 arr是这样的
int arr[] = { 5,2,4,1,3,6 }
1<3 true 所以 1 和 3 的位置变换
现在 arr是这样的
int arr[] ={ 5,2,4,3,1,6 }
1<6 true 所以 1 和 6 的位置变换
现在 arr是这样的
int arr[] ={ 5,2,4,3,6,1 }
一共是比较了5次。
这样第1次比较就完了,最终将最小值1确定到了最后1位,不需要再做比较。
接着进行第二次比较:
与刚才类似:依然是拿第一个数“5”与其后的数做比较。由于数字1已确定为最小,所以不用比较。这样就只需要比较4次。
比完后是这样的:
int arr[] ={ 5,4,3,6,2,1 }
依次类推:第3次比较比3次,结果是这样的
int arr[] ={ 5,4,6,3,2,1 }
接着就是这样的:
第4次比2次 int arr[] ={ 5,6,4,3,2,1 }
第5次比1次 int arr[] ={ 6,5,4,3,2,1 }
数组 arr[] 的长度是6.
一共是比了5次,而每次比较中两两之比的次数又是递减的。
因此可以得出以下图示:
外循环 | 内循环 |
---|---|
第1次比较 | 比了5次 |
第2次比较 | 比了4次 |
第3次比较 | 比了3次 |
第4次比较 | 比了2次 |
第5次比较 | 比了1次 |
3 . 代码
这冒泡排序是不是就这样出来了?
就拿刚刚的数组为例子:
首先:
一共需要比较多少次:
for(int i=0;i<arr.length-1;i++){}
一次比较里面两两相比需要多少次:
for(int j =0;j<arr.length-1-i;j++){}
如果arr[j]上的值小于arr[j+1]上的值就变换位置
if(arr[j]<arr[j+1]){
int temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
最终冒泡排序的代码为:
for(int i=0;i<arr.length-1;i++){
for(int j=0;j<arr.length-1-i;j++){
if(arr[j]<arr[j+1]){
int temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
}
补张图:
结束,收工。