选择排序的代码实现与详解
基本思想
以从小到大排序为例:第一次循环找出n个数中最小的数与arr[0]进行交换,第二次从arr[1]到arr[n-1]中选择一个最小的再与arr[1]交换,以此类推最多进行n-1轮循环即可使序列有序。
代码实现(Java实现,代码只是工具关键是思路 (从小到大))
private static void selectSort(int [] nums){
int n = nums.length;
for (int i = 0; i < n-1; i++) {
int index=i; //每次循环初始化的最小值是 当前处理序列的第一个元素
int min=nums[i];
for (int j = i+1; j < n; j++) {
if(min>nums[j]){
index=j;
min=nums[j];
}
}
if(index!=i){ //最小值不是初始值的时候才交换 否则不用交换
nums[index]=nums[i];
nums[i]=min;
}
System.out.println("第"+(i+1)+"次循环");
System.out.println(Arrays.toString(nums));
}
}
输入:{100,25,120,1}
输出结果:
第1次循环
[1, 25, 120, 100]
第2次循环
[1, 25, 120, 100]
第3次循环
[1, 25, 100, 120]
最终结果:[1, 25, 100, 120]
代码讲解
代码比较好理解,根据输入和输出演算一遍 就可以清楚整体流程。 思想就是 每次循环选择当前剩余的无序序列中的一个最小值把它与序列的最左侧交换,这样就实现了从小到大排序(如果想实现降序,修改判断条件即可。
代码中 i就是 在这次循环中 处理序列的 最左侧元素的下标是i 因为i之前的元素在前面的循环中已经有序了 所以不需要再考虑i之前的元素了 ,从i开始 与j=i+1 一直到最后一个元素 进行比较 找到最小值。并完成交换。
tips
不是每次都需要交换的,如果序列的最左侧元素正好就是序列的最小值 那么就不需要发生交换。