当前位置: 首页 > news >正文

Java实现选择排序算法

1. 选择排序原理图解

选择排序是一种简单直观的比较排序算法。它的基本思想是:每次从未排序的部分中找到最小(或最大)的元素,将其放到已排序部分的末尾。具体步骤如下:

1. 初始状态:数组 `[64, 25, 12, 22, 11]`。
2. 第一次遍历:从未排序部分 `[64, 25, 12, 22, 11]` 中找到最小值 `11`,与第一个元素 `64` 交换,得到 `[11, 25, 12, 22, 64]`。
3. 第二次遍历:从未排序部分 `[25, 12, 22, 64]` 中找到最小值 `12`,与第二个元素 `25` 交换,得到 `[11, 12, 25, 22, 64]`。
4. 第三次遍历:从未排序部分 `[25, 22, 64]` 中找到最小值 `22`,与第三个元素 `25` 交换,得到 `[11, 12, 22, 25, 64]`。
5. 第四次遍历:从未排序部分 `[25, 64]` 中找到最小值 `25`,与第四个元素 `25` 交换(无需操作),得到 `[11, 12, 22, 25, 64]`。
6. 最终结果:数组已完全排序为 `[11, 12, 22, 25, 64]`。

 2. Java代码实现及注释

```java
public class SelectionSort {
    public static void main(String[] args) {
        int[] array = {64, 25, 12, 22, 11};
        selectionSort(array);
        System.out.println("排序后的数组:");
        for (int num : array) {
            System.out.print(num + " ");
        }
    }

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

        // 遍历数组的每个位置
        for (int i = 0; i < n - 1; i++) {
            // 假设当前元素是最小值
            int minIndex = i;

            // 在未排序部分中寻找最小值
            for (int j = i + 1; j < n; j++) {
                if (array[j] < array[minIndex]) {
                    minIndex = j; // 更新最小值的索引
                }
            }

            // 如果找到更小的值,交换位置
            if (minIndex != i) {
                int temp = array[i];
                array[i] = array[minIndex];
                array[minIndex] = temp;
            }
        }
    }
}
```

3. 代码说明

1. 选择排序的核心思想:
   - 每次从未排序部分中找到最小值,并将其放到已排序部分的末尾。
   - 通过两层循环实现:外层循环控制已排序部分的边界,内层循环在未排序部分中寻找最小值。

2. 时间复杂度:
   - **最坏情况**:`O(n²)`(每次都需要遍历整个未排序部分)。
   - **最好情况**:`O(n²)`(即使数组已经有序,仍需完成所有比较)。
   - **平均情况**:`O(n²)`。

3. 空间复杂度:
   - `O(1)`,因为只需要一个额外的变量来交换元素。

4. 稳定性:
   - 选择排序是**不稳定的**,因为交换操作可能改变相同值元素的相对顺序。

4. 应用场景

1. 数据量较小的场景:
   - 选择排序简单易实现,适合对小规模数据进行排序。

2. 内存限制的场景:
   - 由于空间复杂度为 `O(1)`,选择排序在内存有限的情况下表现良好。

3. 教学和演示:
   - 选择排序逻辑简单,常用于教学和算法演示。

5. 总结

选择排序是一种基础的排序算法,虽然时间复杂度较高,但在某些特定场景下仍然具有应用价值。它的特点是实现简单,但效率较低,因此在实际应用中通常被更高效的排序算法(如快速排序或归并排序)所取代。

相关文章:

  • 盛水最多的容器问题详解:双指针法与暴力法的对比与实现
  • vcast工具env环境问题二:<command-line>: error: stray ‘\’ in program
  • 深入解析 sklearn 中的 LabelEncoder:功能、使用场景与注意事项
  • 三、The C in C++
  • TV板卡维修技术【一】
  • 什么是GOTS认证,GOTS认证有什么要求?GOTS认证有什么作用
  • 基于动态注意力机制与双向融合的目标检测模型详解
  • 【树莓派 PICO 2 测评】采集 DS18B20 数据及 OLED 显示
  • Dockerfile项目实战-单阶段构建Vue2项目
  • vue动画
  • 索引语法SQL性能分析索引的使用
  • 依赖注入(DI)与自动装配:本质就是“赋值“吗?
  • PBKDF2全面指南(SpringBoot实现版)
  • AI agents系列之智能体框架介绍
  • Docker华为云创建私人镜像仓库
  • K-均值聚类机器学习算法的优缺点
  • C++第三方库【JSON】nlohman/json
  • CefSharp浏览器(AntdUI.Tabs)标签页关闭时资源释放ChromiumWebBrowser示例源码
  • 【文献笔记】LLM-based and retrieval-augmented control code generation
  • SmolVLM新模型技术解读笔记
  • 圆桌|耐心资本对科技创新有何意义?天使投资最关注哪些要素?
  • 全国首家由司法行政部门赋码登记的商事调解组织落户上海
  • 寺庙餐饮,被年轻人追捧成新顶流
  • 部分人员无资质展业、投资建议无合理依据,天相财富被责令改正
  • 为护航企业“出海”,“无问西东·中外商会”海上沙龙举行
  • 杭州一地铁口建筑被吐槽像棺材,官方回应:暂无拆除计划