之前看算法书的时候对冒泡排序和选择排序有点混淆,它们都是使用双层循环,都存在数据交换.
在阳光明媚的一天,我高高兴兴的打开了我的<<算法图解>>,突然发现选择排序和冒泡排序是
什么鬼,怎么看着都一样,可能是我太久没有用了吧.
①选择排序
for (int i = 0; i < arr.length-1; i++) { // i 循环的次数:length-1,
举个栗子: 3,2,1 进行选择排序:
第一次内层循环结束的结果是: 1,3,2
第二次内层循环结束时结果是: 1,2,3
此时就已经得出正确的排序结果, 无需再进行第三次的内层循环
for (int j = i; j < arr.length; j++) { // 内层循环从i 开始进行比较, 因为 i 之前的元素已经完成了排序
if(arr[i] > arr[j]){ // 此处是选择排序和冒泡排序的核心区别(我是这么认为的-->或者说是我瞎掰的)
//整个if语句块是为了找出需要排序的元素中的最小值,并进行交换
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
②冒泡排序
for(int i = 0 ; i < arr.length-1 ; i++){ // 此处和选择排序中的栗子原理相同
for(int j = 0 ; j < arr.length-1-i ; j++){ // -1是防止索引越界(因为内层循环中的if语句块中存在 arr[j+1]) -i是为了提高效率
if(arr[j] >= arr[j+1]){ // 相邻两个元素之间进行比较 ( 此处是选择排序和冒泡排序的核心区别 )
//if 语句块每次比较的是相邻的两个元素之间的比较,并进行交换
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
折腾了这么久,我觉得我已经饿了, 将就着看吧. 要是有错误或者建议大家可以提出。