今天重新拿来当时学习时就有点糊涂的各种排序方法来好好研究一下,这篇主要对比一下选择排序和冒泡排序两种方法之间的差异
冒泡排序大家应该已经非常了解了,就是通过一个嵌套循环使大的数沉下去小的数浮上来的一种方法,而选择排序则是通过一次又一次遍历数组来找到最小的换到前面的方法,实际上也是一个嵌套循环就可以解决的问题,所以当时学的时候我就对于这两种方法有点区分不开。通过看了看别人的代码现在算是弄明白了两者之间的差别
其实两者的时间复杂度都是O(n²),主要的区别是在于交换次数的不同,冒泡排序只要符合后面的数比自己小就交换,一个一个比一个一个换;而选择排序是遍历一边数组后找到最小的数,记录这个数的值和该值的索引(位置),之后将这个值赋给前面,把前面的值赋给得到的索引(位置),实际上一次遍历仅仅交换一次。
我嘴比较笨,只能这么解释,还是看代码比较直观
这是冒泡排序的:
public static void Maopao(int[] a){
int temp = 0;
for (int i = 1; i <a.length ; i++) { //控制需要遍历的次数,数组长度-1
for (int j = 0; j <a.length-i ; j++) { //控制每个数需要对比的次数,大数往下沉
if(a[j+1]<a[j]){ //交换
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
这是选择排序的:
public static void Selectsort(int[] a) {
for (int i = 0; i < a.length-1; i++) {//循环次数,也是数组长度-1
int value = a[i]; //先得到最开始的值于位置
int position = i;
for (int j = i + 1; j < a.length; j++) {//找到最小的值和位置
if (a[j] < value) {
value = a[j]; //获取最小的值
position = j; //获取取得最小值的位置
}
}
a[position] = a[i];//进行交换,注意这里每次i循环仅仅执行一次,是与冒泡排序最大的区别
a[i] = value;
}
}
从代码中就可以比较直观的看出来选择排序只是遍历找到最小的数,得到位置和值之后跳出内循环再做一次交换,所以交换次数比冒泡排序少了不少