一种简单易懂的方式描述Android开发常见的排序算法:选择排序

2025-01-06 09:10 一种简单易懂的方式描述Android开发常见的排序算法:选择排序已关闭评论

选择排序简介

直观理解:选出最小值依次排列

选择排序(Selection Sort)是一种简单直观的排序算法,其核心思想是:从未排序的部分中找到最小的元素,将它放到已排序部分的末尾。

类比生活场景

想象你在一堆扑克牌中寻找最小的牌,并依次把它们从小到大排好:

  1. 从所有牌中找到最小的那张牌,放到最左边。
  2. 从剩下的牌中继续找最小的牌,放到已排好牌的右侧。
  3. 重复以上步骤,直到所有牌都排好。

算法流程

假设要对数组 [8, 3, 5, 2] 进行升序排序,选择排序的过程如下:

  1. 第1轮

    • 找出整个数组中最小的值 2,与第一个位置的值 8 交换,数组变为 [2, 3, 5, 8]
  2. 第2轮

    • 从剩余未排序部分 [3, 5, 8] 中找到最小值 3,已在正确位置,无需交换。
  3. 第3轮

    • 从剩余未排序部分 [5, 8] 中找到最小值 5,已在正确位置,无需交换。
  4. 第4轮

    • 剩下的部分只有一个元素 8,不需要操作。

最终结果为 [2, 3, 5, 8]


选择排序代码实现

public class SelectionSortUtil {

    /**
     * 对整型数组进行选择排序
     *
     * @param 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;
                }
            }
            // 交换当前元素与找到的最小元素
            int temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }

    // 测试
    public static void main(String[] args) {
        int[] arr = {8, 3, 5, 2};
        selectionSort(arr);

        // 输出结果
        for (int num : arr) {
            System.out.print(num + " ");
        }
        // 输出:2 3 5 8
    }
}

时间复杂度和空间复杂度

时间复杂度

选择排序的核心是两层循环:

  1. 外层循环
    • 遍历数组中的每个位置,次数为 n-1
  2. 内层循环
    • 遍历剩余未排序部分以找到最小值,次数依次为 n-1, n-2, ..., 1

总比较次数为:
[
(n-1) + (n-2) + \cdots + 1 = \frac{n(n-1)}{2}
]
因此,选择排序的时间复杂度为:
[
O(n^2)
]

空间复杂度

选择排序是原地排序算法,不需要额外的存储空间,除了少量临时变量用于交换值。因此:
[
O(1)
]


选择排序的特点

  • 优点

    • 简单易懂,代码实现非常直观。
    • 在数据规模较小时表现良好。
  • 缺点

    • 时间复杂度较高,特别是对大数据量排序时效率不佳。

选择排序在 Android 开发中的应用场景

尽管选择排序的效率较低,但由于其实现简单、内存占用小,仍然适用于某些特殊场景:

  1. 小规模数据排序

    • 在数据量较小的情况下(如少于 10 个元素),选择排序简单直接,代码维护成本低。
  2. 嵌入式环境或低内存设备

    • 在 Android 的 IoT 或嵌入式场景中,如果设备内存有限,选择排序的低内存开销成为一个优势。
  3. 特定排序任务

    • 在特定业务需求中需要手动实现排序逻辑(如自定义控件排序时),选择排序提供了灵活性。

示例:选择排序在 RecyclerView 数据中的应用

假设我们有一个 RecyclerView,用于显示一组用户数据(姓名和年龄),现在需要对数据按照年龄从小到大排序。

数据模型:

class User {
    String name;
    int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return name + " (" + age + ")";
    }
}

排序工具:

import java.util.List;

public class SelectionSortUtil {

    public static void selectionSortUsers(List<User> users) {
        int n = users.size();
        for (int i = 0; i < n - 1; i++) {
            int minIndex = i;
            for (int j = i + 1; j < n; j++) {
                if (users.get(j).age < users.get(minIndex).age) {
                    minIndex = j;
                }
            }
            // 交换
            User temp = users.get(i);
            users.set(i, users.get(minIndex));
            users.set(minIndex, temp);
        }
    }
}

使用示例:

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<User> users = new ArrayList<>();
        users.add(new User("Alice", 25));
        users.add(new User("Bob", 20));
        users.add(new User("Charlie", 23));

        SelectionSortUtil.selectionSortUsers(users);

        // 输出结果
        for (User user : users) {
            System.out.println(user);
        }
        // 输出:
        // Bob (20)
        // Charlie (23)
        // Alice (25)
    }
}

总结

选择排序是一种简单、直观的排序算法,尽管其时间复杂度较高,但在小规模数据或内存受限场景中非常实用。在 Android 开发中,它常用于临时性或小规模数据排序需求,例如:
- 静态列表排序。
- 自定义排序逻辑。
- 内存优化场景(如 IoT 设备上的数据处理)。

当前文章价值3.63元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)

你可能感兴趣的文章

来源:每日教程每日一例,深入学习实用技术教程,关注公众号TeachCourse
转载请注明出处: https://teachcourse.cn/3728.html ,谢谢支持!

资源分享

python读取markdown文件内容 python读取markdown文件内容
Android语言kotlin基本语法介绍和示例说明 Android语言kotlin基本语法介绍
ubuntu中创建Python虚拟环境 ubuntu中创建Python虚拟环境
sql server存储过程基础语法 sql server存储过程基础语法

评论已关闭!