【数据结构】排序算法の直接选择排序

566 阅读2分钟

排序概述

1、排序

排序就是将一组对象按照规定的次序重新排列的过程,排序往往是为检索服务的。

2、稳定性

n 个记录的序列为{R1,R2,…,Rn},其相应的键值序列为{k1, k2,…,kn},假设ki=kj,若在排序前的序列中 Ri 在 Rj 之前,即 i<j,经过排序后,Ri 仍在 Rj 之前,则称所用的排序方法是稳定的;反之,则称所用的排序方法是不稳定的。

(若待排序的序列中存在多个记录具有相同的键值,经过排序,这些记录的相对次序仍然保持不变,则称这种排序方法是稳定的。)

注意: 稳定性是排序方法本身的特性,与数据无关,换句话说,一种排序方法如果是稳定的,则对所有的数据序列都是稳定的,反过来,如果在一组数据上出现不稳定的现象,则该方法是不稳定的。

3、分类

内部排序(Internal Sorting):待排序的记录全部存放在计算机内存中进行的排序过程;

外部排序(External Sorting):待排序的记录数量很大,内存不能存储全部记录, 需要对外存进行访问的排序过程。

直接选择排序

1、基本思想

在第 i 次选择操作中,通过 n-i 次键值间比较,从 n-i+1 个记录中选出键值最小的记录,并和第 i (1≤i≤n-1) 个记录交换。

2、算法

【202008考试真题】对初始关键字序列 45, 38, 66, 90, 88, 10, 25, 45\underline{45} 采用直接选择排序,给出排序过程和结果。

image.png

void SelectSort (List R, int n) { 
    int min,i,j;
    for(i=1;i<=n-1;i++) { //每次循环,选择出一个最小键值
        min=i;
        //假设第 i 个记录键值最小
        for (j=i+1;j<=n;j++) {
            if (R[j].key<R[min].key) min=j; //记录下键值较小记录的下标
        }
        if (min!=i) swap(R[min],R[i]); //将最小键值记录和交换第 i 个记录交换
    }
}

3、图解动态演示

排序直接选择.gif

4、时间复杂度、稳定性

算法的主要部分包含两层嵌套的 for 循环,其时间复杂度为 O(n^2)。直接选择排序算法简单,容易实现,但不适宜于 n 较大的情况。

直接选择排序是不稳定