数据结构-选择排序Java实现

目录

一、引言

选择排序是一种基本的比较排序算法,其思想非常直观:它从未排序的元素中选择最小的元素,然后将其放到已排序的部分的末尾。这个过程一直重复,直到整个数组都被排序。选择排序的时间复杂度是O(n^2),因此不适用于大型数据集,但它非常容易理解和实现。

二、算法步骤

选择排序的基本步骤如下:

  1. 在未排序的部分中,找到最小的元素。
  2. 将找到的最小元素与未排序部分的第一个元素交换位置。
  3. 增加已排序部分的大小,减小未排序部分的大小。
  4. 重复上述步骤,直到整个数组都排好序。

三、原理演示

假设我们有以下整数数组:

64, 34, 25, 12, 22, 11, 90

  • 第一轮:
    在第一轮中,算法将从整个数组中找到最小的元素,并将其放在数组的第一个位置。
    初始状态:未排序部分 [64, 34, 25, 12, 22, 11, 90],已排序部分 []。
    找到未排序部分中的最小元素 11,将其与未排序部分的第一个元素 64 交换,数组变为:已排序部分 [11],未排序部分 [34, 25, 12, 22, 64, 90]。
  • 第二轮:
    在第二轮中,算法将从未排序部分中找到最小的元素,并将其放在已排序部分的末尾。
    未排序部分 [34, 25, 12, 22, 64, 90],已排序部分 [11]。
    找到未排序部分中的最小元素 12,将其与未排序部分的第一个元素 34 交换,数组变为:已排序部分 [11, 12],未排序部分 [25, 34, 22, 64, 90]。
    (继续重复这个过程,每轮选择未排序部分中的最小元素并将其放在已排序部分的末尾)
  • 第三轮:
    未排序部分 [25, 34, 22, 64, 90],已排序部分 [11, 12]。
    找到未排序部分中的最小元素 22,将其与未排序部分的第一个元素 25 交换,数组变为:已排序部分 [11, 12, 22],未排序部分 [34, 25, 64, 90]。

以此类推,直到整个数组都已排序。

选择排序的关键思想是不断选择未排序部分中的最小元素,并将其放在已排序部分的末尾。这一过程反复进行,直到整个数组都被排序。虽然选择排序不是最高效的排序算法,但它是一种简单而直观的算法,适用于小型数据集或用于教育目的。希望这个文字说明能够帮助您更好地理解选择排序的实现过程。

四、代码实战

下面是使用Java编写的选择排序算法示例:

java 复制代码
public class SelectionSort {
    public static void main(String[] args) {
        int[] arr = {64, 34, 25, 12, 22, 11, 90};

        System.out.println("原始数组:");
        printArray(arr);

        selectionSort(arr);

        System.out.println("排序后的数组:");
        printArray(arr);
    }

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

        for (int i = 0; i < n - 1; i++) {
            int minIndex = i;

            for (int j = i + 1; j < n; j++) {
                if (arr[j] < arr[minIndex]) {
                    minIndex = j;
                }
            }

            // 交换arr[i]和arr[minIndex]
            int temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }

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

上述代码演示了选择排序的实现。它首先定义了一个包含整数数组的示例,然后调用 selectionSort 方法来对数组进行排序。selectionSort 方法通过找到未排序部分的最小元素,并与未排序部分的第一个元素交换位置来实现选择排序。

五、结论

我们一起来总结一下:

  1. 选择排序的时间复杂度是O(n^2),其中n是待排序元素的个数。这是因为在每次迭代中,都需要在剩余的未排序元素中找到最小(或最大)元素,然后将其与当前位置的元素交换。
  2. 选择排序的空间复杂度是O(1),因为只需要额外的空间存储临时变量,这个空间并不随输入数据量的增加而增加。
    选择排序是稳定的排序算法,即相等的元素的相对位置在排序后不会改变。
  3. 选择排序在处理大数据集时效率较低,因为其时间复杂度较高。在这种情况下,可能会考虑使用其他更高效的排序算法,如快速排序、归并排序、堆排序等。
  4. 选择排序适合小数据集的排序,因为它的实现简单且直观。如果数据集的大小很大,那么可能需要考虑使用更高效的算法来获得更好的性能。
  5. 在某些情况下,如数据已经部分有序的时候,选择排序可能会表现出较好的性能,因为它每次都会从小到大(或从大到小)选取一个元素。但是,如果数据的初始顺序和选择排序的顺序相反,那么选择排序的性能就会较差。

点赞收藏,富婆包养✋✋

相关推荐
Java水解17 分钟前
微服务架构下Spring Session与Redis分布式会话实战全解析
后端·spring
Moe48817 分钟前
如何使用 Spring Cache 结合 Redis 和 Caffeine 构建二级缓存机制
后端
CoovallyAIHub1 小时前
OpenClaw 近 2000 个 Skills,为什么没有一个好用的视觉检测工具?
深度学习·算法·计算机视觉
CoovallyAIHub1 小时前
CVPR 2026 | 用一句话告诉 AI 分割什么——MedCLIPSeg 让医学图像分割不再需要海量标注
深度学习·算法·计算机视觉
Json_Lee1 小时前
2026 年了,多 Agent 编码该怎么选?agent-team vs Claude Agent Teams vs Claude Squad vs Met
前端·后端·vibecoding
CoovallyAIHub1 小时前
Claude Code 突然变成了 66 个专家?这个 5.8k Star 的开源项目,让我重新理解了什么叫"会用 AI"
深度学习·算法·计算机视觉
陈随易1 小时前
刚上市就断货?如此火爆的编程显示器到底有什么魔力
前端·后端·程序员
兆子龙1 小时前
前端哨兵模式(Sentinel Pattern):优雅实现无限滚动加载
前端·javascript·算法
ray_liang2 小时前
一小时手搓轻量级可代替 Qdrant 的向量数据库
后端·架构
后端AI实验室2 小时前
我把一个生产Bug的排查过程,交给AI处理——20分钟后我关掉了它
java·ai