选择排序(SelectSort)

本文详细介绍了选择排序算法的基本原理和实现过程,对比了选择排序与冒泡排序的不同之处,并通过一个具体的排序实例展示了选择排序的具体操作步骤。此外,还讨论了选择排序的稳定性问题及其Java实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 选择排序

选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。选择排序与冒泡排序非常的相似,都是一层层筑顶的过程,不同点在于冒泡排序会频繁的互换位置,而选择排序只是记录最大元素的位置,并与顶互换,只需交换一次,所以选择排序与冒泡排序相比时间消耗会更少,更有效率,尽管它们最坏的时间复杂度都是O(n^2).

2 稳定性

选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择中,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。例如,序列 5、8、5、2、9,我们知道第一遍选择第 1 个元素 5 和 2 交换,那么原序列中两个 5 的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。

3 排序实例

运用选择排序将数组arr[] = {3, 2, 1, 0, -1 , -2, -3}进行排序,则其排序步骤如下:

  • 初始化:3 2 1 0 -1 -2 -3
  • 第一次:-3 2 1 0 -1 -2 3
  • 第二次:-3 -2 1 0 -1 2 3
  • 第三次:-3 -2 -1 0 1 2 3.

排序完毕。

4 Java代码

public class SelectSort {      
    public static void main(String[] args) {
        int[] arr = {3, 2, 1, 0, -1, -2, -3};
        System.out.println("Before sort:");
        printArray(arr);
        selectSort(arr);
        System.out.println("After sort:");
        printArray(arr);
    }

    private static void selectSort(int[] arr) {
        // 判断数组是否为空或者数组元素个数为 1
        if (arr == null || arr.length < 2) {
            return;
        }
        for (int i = arr.length - 1; i > 0; i--) {
            // 假设 i 是最大元素的下角标
            int maxIndex = i;
            // 依次将前 i-1 个元素同第 i 个元素相比较
            for (int j = i - 1; j >= 0; j--) {
                if (arr[j] > arr[maxIndex]) {
                    maxIndex = j;
                }
            }
            // 如果最大元素的下角标不等于 i,则将其进行交换
            if (maxIndex != i) {
                int temp = arr[i];
                arr[i] = arr[maxIndex];
                arr[maxIndex] = temp;
            }
        }
    }

    /**
     * 打印数组
     *
     * @param arr
     */
    private static void printArray(int[] arr) {
        System.out.print("{");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]);
            if (i < arr.length - 1) {
                System.out.print(", ");
            }
        }
        System.out.println("}");
    }
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安正勋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值