牛叔叔 的笔记

好好学习

2024-09-22 14:05

选择排序(Selection Sort)

牛叔叔

JavaEE

(389)

(0)

收藏

选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理是首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

在Java中,选择排序可以通过嵌套循环来实现。外层循环控制排序的轮数,内层循环负责在每一轮中找到最小(或最大)的元素,并将其与当前位置的元素交换。

下面是Java中选择排序的一个实现示例,并附有详细的注释:

public class SelectionSort {
    public static void main(String[] args) {
        int[] arr = {64, 25, 12, 22, 11};
        selectionSort(arr);
        System.out.println("Sorted array: ");
        printArray(arr);
    }

    // 选择排序算法
    static void selectionSort(int arr[]) {
        int n = arr.length;

        // 外层循环:控制排序的轮数
        for (int i = 0; i < n-1; i++) {
            // 假设当前位置i就是最小的数的位置
            int min_idx = i;

            // 内层循环:在未排序的数组中找到最小数的索引
            for (int j = i+1; j < n; j++) {
                if (arr[j] < arr[min_idx]) {
                    // 更新最小数的索引
                    min_idx = j;
                }
            }

            // 将找到的最小数交换到它应该在的位置
            // 如果min_idx已经等于i,说明i位置的数已经是最小的了,无需交换
            if (min_idx != i) {
                int temp = arr[i];
                arr[i] = arr[min_idx];
                arr[min_idx] = temp;
            }
        }
    }

    // 辅助方法,用于打印数组
    static void printArray(int arr[]) {
        for (int i=0; i < arr.length; i++)
            System.out.print(arr[i] + " ");
        System.out.println();
    }
}

代码解析

  1. 初始化:设置两个循环,外层循环变量i从0开始,到n-2结束(因为排序到最后只剩下一个元素时,它已经是排序好的了,无需再比较)。内层循环变量ji+1开始,到n-1结束,用于在未排序的数组部分查找最小元素的索引。

  2. 查找最小元素:内层循环遍历从i+1n-1的所有元素,如果发现有更小的元素,则更新最小元素的索引min_idx

  3. 交换元素:当内层循环结束后,min_idx就指向了当前轮次中最小元素的索引。如果min_idx不等于i,则说明找到了一个比当前i位置更小的元素,需要将其与i位置的元素交换。如果min_idx等于i,则说明i位置的元素已经是最小的了,无需交换。

  4. 重复:重复上述过程,直到整个数组排序完成。

  5. 打印结果:使用辅助方法printArray打印排序后的数组。

选择排序的时间复杂度是固定的,为,其中是数组的长度。它不受输入数据的影响,即使输入数组已经是排序好的,选择排序的时间复杂度仍然是。这使得它在处理大数据集时效率较低,但在一些特定场景下(如数据交换开销非常大时),由于其稳定的性能表现,仍然有一定的应用价值。


0条评论

点击登录参与评论