排序第二篇 直接选择排序

选择排序的基本思想: 每一趟在待排序的记录中选出关键字最小的记录, 依次存放在已排好序的记录序列的最后, 直到全部记录排序完为止。
选择排序可分为2类
排序第二篇 直接选择排序_第1张图片

一 简介

本文介绍 直接选择排序 (Straight Select Sort)
其基本思想是: 每次从待排序的无序区中选择出关键字值最小的记录, 将该记录与该区中的第一个记录交换位置。
初始时,数组R[1…n]为无序区,有序区为空,
第一趟排序是在无序区中选出最小的记录, 将它与R[1] 交换, R[1]为有序区;
第二趟排序是在无序区R[2…n]中选出最小的记录与R[2]交找, 此时 R[1…2]为有序区;

依次类推, 做 n-1 趟排序后, 区间 R[1…n]中记录按递增有序。

在直接选择排序中,存在着不相邻记录之间的交换, 所以此排序法是不稳定的。

这句话必须牢牢记住!!!这是回答某种排序不稳定的关键原因
我们又一次看到这个结论, 与上篇 快速排序 极为相似

以java为例, 看一个demo.

public class SelectSort {

    public static void main(String[] args) {
        Integer[] array_ = new Integer[]{30,45,10,30,50};
        System.out.println("初始顺序\n"+Arrays.toString(array_)+"以下为排序过程:");
        selectSort(array_);
        System.out.println("过程结束, 最后顺序\n"+Arrays.toString(array_));
    }

    static void selectSort(Integer[] array){

        //设 k 为第 i 趟排序中关键字最小的记录位置,  temp为临时变量
        int  k, temp;
        for(int i=0; i< array.length-1; i++){
            k = i;
            for(int j=i+1; j<=array.length-1 ; j++) {
                if (array[j] < array[k]) {
                    k = j;
                }
            }
            if (k != i) {
                temp = array[i];
                array[i] = array[k];
                array[k] = temp;
                System.out.println(Arrays.toString(array));
            }
        }
    }
}

程序运行结果:
排序第二篇 直接选择排序_第2张图片


动画如下所示

直接选择排序 动画示意

注意: 红色柱 表示基准、哨兵 绿色柱表示被比较的值

二 时间复杂度与空间复杂度

直接选择排序的平均时间复杂度为 O ( n 2 ) {O(n^2)} O(n2), 空间复杂度为 O ( 1 ) O(1) O(1).

你可能感兴趣的:(排序算法,数据结构,排序算法)