选择排序--java(详解)

详细过程:

需要三个指针(i, j, m)

i--每次两数比较时较靠前的数

j--每次两数比较时较靠后的数

m--表示每次两数比较时较小的数

对于原始数组 [4, 6, 3, 9]

代码实现:

// 这是选择排序的简易版本
public class SelectSort{
    // 定义一个主函数
    public static void main(String[] args){
        // 定义一个数组
        int[] arr = {4, 6, 3, 9};
        // 打印排序前的数组
        System.out.println(Arrays.toString(arr));
        // 调用选择排序函数
        selectSort(arr);
        // 打印排序后的数组
        System.out.println(Arrays.toString(arr));
    }
    // 定义一个对无序数组进行选择排序的函数 接收一个参数 即原始数组
    public static void selectSort(int[] arr){
        // 首先初始化三个指针
        int i, j, minIndex;
        // 首先要对特殊情况进行处理
        if(arr == null || arr.length < 2){
            return;
        }
        // 定义两层循环 外层循环临时变量为i 内层循环临时变量为j
        for(i = 0; i < arr.length - 1; i++){
            // 定义一个指针 用于指向两数比较中较小的那个数
            minIndex = i;
            for(j = i + 1; j < arr.length; j++){
                // 如果m指针指向的数大于j指针指向的数的话 那么就要更新m指针的指向
                if(arr[j] < arr[minIndex]){
                    minIndex = j;
                }
            }
            // 当内层循环完毕后 需要交换m指针指向的数和i指针指向的数
            swap(arr, minIndex, i);
        }
    }
    // 定义一个函数 用于交换两个数 接收三个参数 即原始数组、索引一、索引二
    public static void swap(int[] arr, int index1, int index2){
        int temp = arr[index1];
        arr[index1] = arr[index2];
        arr[index2] = temp;
    }
}

但是上述做法还有优化的余地 上述做法属于单个指针向左遍历 我们可以左右两边同时设置两个指针 分别向左向右遍历其余元素 其余的做法与上述做法如出一辙

优化过后 对于原始数组 [4, 6, 3, 9]

代码优化:

import java.util.Arrays;
​
public class SelectSortOptimization{
    // 定义一个主函数
    public static void main(String[] args){
        // 定义一个数组
        int[] arr = {4, 6, 3, 9};
        // 打印排序前的数组
        System.out.println(Arrays.toString(arr));
        // 调用选择排序函数对无序数组进行升序排序操作
        selectSortOptimization(arr);
        // 打印排序后的数组
        System.out.println(Arrays.toString(arr));
    }
    // 定义一个函数 用于对无序数组进行选择排序 接收一个参数 即原始数组
    public static void selectSortOptimization(int[] arr){
        // 需要对一些特殊情况进行处理
        if(arr == null || arr.length < 2){
            return;
        }
        // 定义五个指针
        int i, j, k, minIndex, maxIndex;
        // 为i和j赋初始值
        i = 0;
        j = arr.length - 1;
        // 定义两层循环 外层循环为while循环 条件为i<j 内层循环为for循环 临时变量为每次向左移动或者向右移动时指针所指向的数 因为需要两个方向移动 所以范围为[i,j]
        while(i < j){
            // 首先得先给minIndex和maxIndex指针赋值 初始值分别为i和j
            minIndex = i;
            maxIndex = j;
            for(k = i; k <= j; k++){
                // for循环中的左k指针和右k指针并不是两个独立的指针 其实上是同一个指针 只不过这样讲会比较好理解一点
                // 当左k指针指向的数小于minIndex指针指向的数时 此时需要更新minIndex指针
                if(arr[k] < arr[minIndex])
                    minIndex = k;
​
                // 当右k指针指向的数大于maxIndex指针指向的数时 此时需要更新maxIndex指针
                if(arr[k] >= arr[maxIndex])
                    maxIndex = k;
​
            }
            // for循环完毕以后 需要交换maxIndex指针指向的数和j指针指向的数 也需要交换minIndex指针指向的数和i指针指向的数
            // 首先交换一下maxIndex指针数和j指针数
            int temp = arr[maxIndex];
            arr[maxIndex] = arr[j];
            arr[j] = temp;
            // 接着如果想要交换minIndex指针数和i指针数的话 需要对一个特殊情况进行处理
            // 如果minIndex指针最后指向了j指针所指向的数的话 那么前面有已经将j指针数和maxIndex指针数进行了交换 如今我们想要做的操作是将minIndex指针数(也就是原来j指针数)与i指针数进行交换 但是由于被maxIndex指针抢先一步交换 所以我们应该把minIndex指针赋值为maxIndex指针
            if(minIndex == j){
                minIndex = maxIndex;
            }
            // 交换一下i指针数和minIndex指针数
            temp = arr[minIndex];
            arr[minIndex] = arr[i];
            arr[i] = temp;
            // 然后写完以后不要忘了条件控制语句 让i指针向左移动 j指针向右移动
            i++;
            j--;
        }
    }
}

这就是我对选择排序的理解 大家如果有什么意见可以提出来 我们一起进步!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

axihaihai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值