选择排序以及实现思想

选择排序,字面上理解为先选择,后排序,我们来看看官方怎么说的:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。

简单点来说就是从已有的数组里面每次选出一个最小(或最大的)的数值

(代码在最后)

(图引自互联网)

博主觉得实现算法的思想更重要,接下来说说我的思想(可供参考):

1.首先排序一类的算法肯定要用循环来做,找好循环所需要的条件:排序的次数为(数组长度-1),每排完一轮,前面的元素已经排好一位,最后只剩一个就是最大(最小)的那个,就不用排了

所以外循环为 for (int i = 0; i < arr.length - 1; i++)

2.既然是每轮排序选出最值,所以还得嵌套一个循环,怎么找内循环的条件呢?第一次找出第一个最值了,然后下一轮找的次数就该-1了,以此类推,每进行一轮循环,次数少一次,那么内循换从哪开始呢?从i+1开始,因为每循环一轮,前面的0~i个都已经排好了,不太明白的小伙伴可以捋一下思路,循环次数为数组的长度,而不是数组长度-1了,因为要保证这一轮所有元素均参与排序

所以内循换为 for (int j = i + 1; j < arr.length; j++) 

3. 既然整体框架已经确定了,就要寻找最值了,内循环里加个if判断,以找出最值然后赋值给临时变量,下面我有解释临时变量的来历

if (arr[j] < arr[MinIndex]) {
    MinIndex = j;
    MinValue = arr[j];
}

4. 找出最值以后,就要保存这个数了,这里我们提前在外循环定义临时变量把当前的arr[ i ]以及下标 i 保存好,为什么这么做呢?因为如果找出这一轮的最值,需要把最值和当前的arr[ i ]交换一下。

int MinIndex = i;
int MinValue = arr[MinIndex];

5. 最后要赋值了,这时候已经找出来而且跳出内循换了,因为最值以及下标已经保存到临时变量里了,所以先把arr[ i ] 赋给最值,后把最值赋给arr[ i ],只能是这个顺序,否则当前的arr[ i ]会丢失。具体还请小伙伴多思考思考。代码如下。

package com.gaojiale.PaiXu;

import java.util.Arrays;
/*
*
* 选择排序
* */
public class selectionsort {
    public static void main(String[] args) {
        int arr[] = {9,5,-1,23,66,11};
        SelectSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    public static void SelectSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            int MinIndex = i;
            int MinValue = arr[MinIndex];
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[MinIndex]) {
                    MinIndex = j;
                    MinValue = arr[j];
                }
            }
            arr[MinIndex] = arr[i];
            arr[i] = MinValue;
        }
    }
}

 有问题欢迎下方留言,侵删。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值