从最基础的选择排序开始

164 阅读2分钟

选择排序比较简单,可能是我们很多人接触的第一个算法。虽然我能写出来,但感觉并没有抓到本质,今天试图用讲解的形式,检验下自己的理解。

实现思路

先说一下选择排序的实思路:先从起始位置开始,与其后的元素做对比,找出最小或最大的元素,放到起始位置,然后从第二个位置开始,与后边的元素做比较,找出最小或最大的元素,放到第二个位置,以此类推。

按照先简单后复杂、先局部后整体的思路,我们来实现一下选择排序

第一步

第一步,从起始位置开始,找出最小的元素

`

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的长度减一,原因是最后一个元素在前一次已经排好序了,它就是最后一个了,不需要再进行以此循环判断了。

后续

这里还有其他优化方式,比如在进行比较的时候,可以同时找出最大的元素,将它放到数组的最后,以此类推,可以减少一半的循环工作。

感谢阅读