排序是算法中常见的一种操作,而最长见的排序方法有冒泡排序和选择排序。冒泡排序方法简单容易理解,今天我们来看一下选择排序的实现:
//这是我直接从IDEA里面复制出来的,可以直接复制这个方法到类中使用
public static void selectionSort(double[] list){ //这个方法名为selectionSort---选择排序
for(int i = 0; i <list.length-1; i++){ //以数组长度作为循环次数,循环
double cur = list[i]; //创建一个中间值用来存储数值中的值,以免改变数组
int cur_index = i; //创建一个与中间值对应的下标来存储数组中元素的下标
------------------------------------------------------------------------------------
//下面循环了一次数组,找出最小值,和其对应的下标
for(int j = i+ 1; j <list.length;j++){ //初始位置总是在i+1的地方,是为了避免重复查找。
if (cur > list[j]){ //如果当前值大于数组中下一个位置的值
cur = list[j]; //将下一个位置的值和下标赋值都给cur
cur_index = j;
}
}
----------------------------------------------------------------------------------
if(cur_index != i){ //如果当前cur的位置发生了改变(i是cur的上一个位置值,cur_index是当前位置)
list[cur_index] = list[i];//那么将数组中上一个值赋值给当前值
list[i] = cur;//将临时值赋值给上一个值
}
}
}
}
看起来挺复杂的样子
同学,现在还不需要全部理解,先将其记住,在使用的过程中慢慢理解,才是循序渐进的方法,首先是拿下它。要的就是耐心和保持信心。
我们试着带入数组将其显示化出来每一个大的循环都做了什么
此时大循环对应的i为0:
初始化一个数组里面包含这些值:
2 9 5 4 8 1 6
第一个小循环里面,找出最小值:1
第二个小循环里面,交换最小值与大循环对应的值:
现在:
1 9 5 4 8 2 6
--------------------------------------------------------------------------------
再重复上面的步骤
此时大循环对应的i=1 :
数组里面包含这些值:
1 9 5 4 8 2 6
第一个小循环里面,找出最小值:2
第二个小循环里面,交换最小值与大循环对应的值:
现在:
1 2 5 4 8 9 6
----------------------------------------------------------------------------------------
再重复上面的步骤
此时大循环对应的i=2 :
数组里面包含这些值:
1 2 5 4 8 9 6
第一个小循环里面,找出最小值:4
第二个小循环里面,交换最小值与大循环对应的值:
现在:
1 2 4 5 8 9 6
----------------------------------------------------------------------------------------
再重复上面的步骤
此时大循环对应的i=3 :
数组里面包含这些值:
1 2 4 5 8 9 6
..........
接下来的几个循环
数组变成了
1 2 4 5 6 9 8
又变成了
1 2 4 5 6 8 9
最后由于数列中只剩最后一个数字,排序结束
上面的循环有一部分被省略掉了,那些重复的循环,如果现在不会,试着多去读一些,渐渐地就会清楚。