选择排序比较简单,可能是我们很多人接触的第一个算法。虽然我能写出来,但感觉并没有抓到本质,今天试图用讲解的形式,检验下自己的理解。
实现思路
先说一下选择排序的实思路:先从起始位置开始,与其后的元素做对比,找出最小或最大的元素,放到起始位置,然后从第二个位置开始,与后边的元素做比较,找出最小或最大的元素,放到第二个位置,以此类推。
按照先简单后复杂、先局部后整体的思路,我们来实现一下选择排序
第一步
第一步,从起始位置开始,找出最小的元素
`
public void chooseSort(int[] nums){
int minPos=0;//用来保存最小元素的下标
for(int i=1;i++;i<nums.length){
if(nums[i]>nums[minPos])
minPos=i;
}
//交换元素,让最小元素排到第一位
int temp=nums[i];
nums[i]=nums[minPos];
nums[minPos]=temp;
}
`
第二步
现在,我们将第一个元素已经和最小的元素做了交换,接下来需要对第二个元素做同样的操作,这样的话,我们加一层循环就可以了
`
public void chooseSort(int[] nums){
for(int j=0;j+;j<nums.length){
int minPos=j;//还未排好序的最小元素就是当前元素
for(int i=j+1;i++;i<nums.length){//这里将i的初始值替换为j+1,只需和它后边的元素做对比即可
if(nums[i]>nums[minPos])
minPos=i;
}
//交换元素,让最小元素排到第一位
int temp=nums[i];
nums[i]=nums[minPos];
nums[minPos]=temp;
}
}
`
这样,选择排序就完成了,下边是编译器里复制出的代码
`
完整代码
/**
* 选择排序:思路 1. 拿第一个数和其他数比较,找出最小的,交换位置
*
* @param nums
* @return
*/
public static void sort(int[] nums) {
for (int i = 0; i < nums.length; i++) {
int minPos = i;
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] < nums[minPos])
minPos = j;
}
int temp = nums[i];
nums[i] = nums[minPos];
nums[minPos] = temp;
}
}
`
优化点
这里还有个优化的点,我们在第一个循环的时候,可以设置循环的次数为nums的长度减一,原因是最后一个元素在前一次已经排好序了,它就是最后一个了,不需要再进行以此循环判断了。
后续
这里还有其他优化方式,比如在进行比较的时候,可以同时找出最大的元素,将它放到数组的最后,以此类推,可以减少一半的循环工作。
感谢阅读