选择排序:
思路:
int arr[]= {5,6,2,4,3,1}; //这个"[]“放在arr后面也是可以的,和C语言一样
流程:
第一轮比较
if(arr[0]>arr[1]){ //这里 5不大于6,什么都不做
int temp = arr[0];
arr[0] = arr[1];
arr[1] = temp;
}
if(arr[1]>arr[2]){ //这里 5大于2,交换元素
int temp = arr[0];
arr[0] = arr[1];
arr[1] = temp;
}
此时数组变为 {2,6,5,4,3,1}
if(arr[2]>arr[3]){ //这里 5大于4,交换元素
int temp = arr[0];
arr[0] = arr[1];
arr[1] = temp;
}
........
第二轮比较
// 此时数组为{1,6,5,4,3,2}
if(arr[1]>arr[2]){ //第一轮比较后,arr[0]为最小值已经确定,直接从arr[1]开始比
int temp = arr[0];
arr[0] = arr[1];
arr[1] = temp;
}
.......
我这里犯懒直接省略了,我先要自己复习一遍,理解后表达出来,
最骚的是我还得排版 /(ㄒoㄒ)/~~
代码
public static void selectionSort() {
//选择排序
int[] arr = {5, 6, 2, 4, 3, 1};
for (int i = 0; i < arr.length - 1; i++) { //外层选中的元素
for (int j = i + 1; j < arr.length; j++) { //内层从i后依次取出元素与i比较
if (arr[i] > arr[j]) {
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
优化:
public static void selectionSort2() {
//选择排序
int[] arr = {5, 6, 2, 4, 3, 1};
for (int i = 0; i < arr.length - 1; i++) { //外层共需比较n-1轮
int flag = i; //添加的代码,记录选中元素的位置
for (int j = flag + 1; j < arr.length; j++) { //内层每次从flag后依次取出元素与i比较,这里要将flag替换i,这样才能保证
if (arr[flag] > arr[j]) { //拿到最小值
flag = j;
}
}
if(flag !=i){ //和上篇的冒泡优化原理相同,减少交换次数
int temp = arr[flag];
arr[flag] = arr[i];
arr[i] = temp;
}
}
System.out.println(Arrays.toString(arr));
/**
* tip:建议打个断点Debug一下,跟着流程走一遍就能很好的理解了
*/
}