图解数组高级冒泡排序和选择排序
微语:人生若只如初见,何事秋风悲画扇? 等闲变却故人心,却道故人心易变。 骊山语罢清宵半,泪雨霖铃终不怨。 何如薄幸锦衣郎,比翼连枝当日愿。 ——纳兰性德 《木兰词》
一、数组高级冒泡排序
-
需求: 对数组元素:{24, 69, 80, 57, 13}进行冒泡排序
-
分析: 相邻元素两两比较,大的往后放,第一次完毕最大值出现在了最大索引处。
第一次比较arr[0]和arr[1]、arr[1]和arr[2]、arr[2]和arr[3]、arr[3]和arr[4];比较4次,得出最大数80
第二次比较arr[0]和arr[1]、arr[1]和arr[2]、arr[2]和arr[3];比较3次,得出最大数69
第三次比较arr[0]和arr[1]、arr[1]和arr[2];比较2次,得出最大数57
第四次比较arr[0]和arr[1];得出最大值24,比较1次,比较完成
通过这分析我们可以知道5个数只需要比较4次,所以外层需要通过一个for循环去控制,循环的次数就是arr.length-1。总共我们需要比较四大次,但是在第一大次中,还需要比较四小次。然后第二大次中,还需要比较三小次,依次类推,我们可以得到一个规律,只要分析出思路,接下来的代码是容易实现的了。 -
图解
image.png -
运行结果
image.png -
代码(完整)
package algorithm;
/**
* Project:Kotlin
* Package:algorithm
* Author:SKFsky
* Description: 排序,冒泡排序和选择排序及二分查找
*/
public class algorithm_sort {
public static void main(String[] args) {
demo1()//冒泡排序
//demo2();//选择排序
}
public static void demo1(){
int[] arr = {24, 69, 80, 57, 13};
int temp = 0;
for (int i = 0;i<arr.length-1;i++) {
for (int j = 0;j<arr.length-i-1;j++) {
if (arr[j]>arr[j+1]){
temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
for (int i = 0;i<arr.length;i++) {
System.out.println(arr[i]);
}
}
}
二、数组高级选择排序
-
需求: 对数组元素:{24, 69, 80, 57, 13}进行选择排序
-
分析:
第一次arr[0]和arr[1],arr[0]和arr[2],arr[0]和arr[3],arr[0]和arr[4],比较四次,求出arr[0]最小值16,下次排序不带最小值
第二次arr[1]和arr[2],arr[1]和arr[3],arr[1]和arr[4],比较三次,求出arr[1]最小值24,下次排序不带最小值
第三次arr[2]和arr[3],arr[2]和arr[4],比较两次,求出arr[2]最小值35,下次排序不带最小值
第四次arr[3]和arr[4],比较一次,求出arr[2]最小值70,比较结束 -
图解:
image.png -
运行结果:
image.png -
代码展示:
public static void demo2(){
int[] arr = {24, 69, 80, 57, 13};
int temp = 0;
for (int i = 0;i<arr.length-1;i++) {
for (int j = i+1;j<arr.length;j++){
if (arr[i]>arr[j]) {
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
for (int i = 0;i<arr.length;i++) {
System.out.println(arr[i]);
}
}
总结:算法题难的不在于代码的实现,而在于我们的思路,只要能理清思路总结出规律,用代码只是去实现了,思路还是需要多练才是王道,练多了也就有经验了。