• 选择排序--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= 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--;
            }
        }
    }

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

  • 相关阅读:
    组件自定义事件
    01年前端程序的副业之路
    腾讯云学生用户专享便宜云服务器购买指南
    maven 项目添加 git-hook 脚本,约束提交内容格式
    windows 11 install windows subsystem for android
    【数据结构】线性表(八)队列:顺序队列及其基本操作(初始化、判空、判满、入队、出队、存取队首元素)
    Vue+element搭建后台管理系统-二、安装插件
    Windows OpenGL ES 图像反色
    详解Native Memory Tracking之追踪区域分析
    Linux软件使用及基础知识
  • 原文地址:https://blog.csdn.net/m0_71299382/article/details/128044326