【数据结构与算法】选择排序算法的介绍和程序实现

1. 选择排序的介绍

选择排序(select sorting)的基本思想是:第一次从arr[0] ~ arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1] ~ arr[n-1]中选取最小值,与arr[1]交换,…,第n-1次从arr[n-2] ~ arr[n-1]中选取最小值,与arr[n-2]交换。总共通过n-1次,得到一个按排序码从小到大排列的有序序列

虽然选择排序和冒泡排序的时间复杂度都是 O ( n 2 ) O(n^2) O(n2),但选择排序对数组的值替换次数少很多,所以执行速度更快

2. 选择排序的特点

  1. 算法完成需要n - 1趟排序,按照算法的描述,n - 1趟排序之后数组中的前n - 1个元素已经处于相应的位置,第n个元素也处于相应的位置上

  2. 第i趟排序,实际上就是需要将数组中第i个元素放置到数组的合适位置,这里需要一个临时变量min来遍历序列中未排好的那些元素,另一临时变量minIndex来记录未排好序的那些元素中值最小的元素的下标值

  3. 一趟遍历开始时,令minIndex = i,假定未排序序列的第一个元素就是最小的元素,遍历完成后,变量minIndex所对应的值就是值最小的元素,判断minIndex是否是未排序序列的第一个元素,如果是,则不需要交换元素,如果不是,则需要交换array[minIndex]和array[i]

  4. 此方法是不稳定排序算法

  5. 此方法移动元素的次数比较少,但是不管序列中元素初始排列状态如何,第i趟排序都需要进行n - i次元素之间的比较,因此总的比较次数为1 + 2 + 3 + 4 + 5 + … + n - 1 = n(n-1)/2

3. 选择排序的程序实现

需求:有一组无序的数据{101, 34, 119, 1, -1, 90, 123},请用选择排序算法实现从小到大排列

程序实现:

import java.util.Arrays;

public class SelectSort {

    public static void main(String[] args) {
        int[] arr = {101, 34, 119, 1, -1, 90, 123};

        selectSort(arr);

        System.out.println("排序后:");
        System.out.println(Arrays.toString(arr));
    }

    // 选择排序
    public static void selectSort(int[] array) {

        // 选择排序时间复杂度是O(n^2)
        // 用于控制遍历多少轮
        for (int i = 0; i < array.length - 1; i++) {
            // 假设当前index的值是最小值
            int minIndex = i;
            int min = array[i];
            // 用于控制在一轮中,遍历多少次
            for (int j = i + 1; j < array.length; j++) {
                // 如果找到的值比当前值还小,则将最小值置为找到的值
                if (min > array[j]) {
                    min = array[j];
                    minIndex = j;
                }
            }

            // 一轮遍历完成后,如果最小值的index和当前index不一样,则进行最小值的替换
            if (minIndex != i) {
                array[minIndex] = array[i];
                array[i] = min;
            }
        }
    }

}

运行程序,结果如下:

排序后:
[-1, 1, 34, 90, 101, 119, 123]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值