冒泡排序是当前的值和下一个值比较,如果当前值大于下一个值,就调换两者的位置。每次调用的时候都会确定一个最大值放在最后,就像是在一个一个的泡按照顺序往上冒。
所以内部的循环是
例如数组是a
// 第n个泡泡
for(int i =0 ;i<n;i++){
if(int[i]>int[i+1]){
int tem = int[i];
int[i] = int[i+1];
int[i+1] = tem;
}
}
但是一共有a.length个泡泡要冒
所以上面的循环至少要执行a.length次,当然最后一次就只有一个泡泡了
所以还需要嵌套一层for循环,他的作用是控制n是哪一个泡
for(int i = 0;i<a.length;i++){
// 0<=i<a.length
// 上面的代码写错了,是第n+1个代表当前的冒的泡的是第几个泡
// 而n是当前的泡与n个泡的判断大小
// 所以n的取值范围是0-a.length-1
// 当n是0的时候,表示冒泡结束
通过i的计算可以得出n的取值范围在n=a.length-i-1
}
// 所以最后的代码如下
for(int i = 0;i<a.length;i++){
for(int j = 0;j<a.length-i-1){
if(a[j]>a[j+1]){
int tem = a[j];
a[j] = a[j+1];
a[j+1] = tem;
}
}
}
而选择排序就是一个元素和当前大于该元素下标的集合比较,如果元素是最小的,就和当前元素交换。
所以代码如下:
for(int i = 0;i<a.length;i++){
for(int j=i+1;i<j<a.length;j++){
if(int[i]>int[j]){
int tem = int[i];
int[i] = int[j];
int[j] = tem;
}
}
}
这两种排序方式的时间复杂读是O(n^2),空间复杂度是O(n),都是一样的。用的时候看个人喜好了。