首页 > 编程语言 >常见的排序算法——选择排序

常见的排序算法——选择排序

时间:2024-04-02 14:44:46浏览次数:23  
标签:... int 常见 算法 time cpp 排序

本文记述了选择排序的基本思想和一份参考实现代码,并在说明了算法的性能后用实验进行了验证。

◆ 思想

将第一个元素开始的所有元素作为待排序范围,通过一一比较,查找待排序范围内的最小元素,将其与范围内的第一个元素交换。然后将从第二个元素开始的所有元素作为新的待排序范围。重复以上的比较、查找和交换,直至待排序范围中无元素为止。

如要得到逆序的结果,则仅需改变比较的方向即可。

◆ 实现

排序代码采用《算法(第4版)》的“排序算法类模板”实现。(代码中涉及的基础类,如 Array,请参考算法文章中涉及的若干基础类的主要API

// selection.hxx

...
class Selection
{

    ...

    template
    <
        class _T,
        class = typename std::enable_if<std::is_base_of<Comparable<_T>, _T>::value>::type
    >
    static
    void
    sort(Array<_T> & a)
    {
        int N = a.size();
        for (int i = 0; i < N; ++i) {               // #1
            int min = i;
            for (int j = i+1; j < N; ++j)             // #2
                if (__less__(a[j], a[min])) min = j;
            __exch__(a, i, min);                        // #3
        }
    }
    
    ...

反复处理待排序范围(#1),通过比较,查找待排序范围内的最小元素(#2),将其与范围内的第一个元素交换(#3)。

◆ 性能

时间复杂度 空间复杂度 是否稳定
N^2 1

◆ 验证

测试代码采用《算法(第4版)》倍率实验方案,验证其正确性并获取时间复杂度数据。

// test.cpp
    
...
time_trial(int N)
{
    Array<Double> a(N);
    for (int i = 0; i < N; ++i) a[i] = Std_Random::random();    // #1
    Stopwatch timer;
    Selection::sort(a);                     // #2
    double time = timer.elapsed_time();
    assert(Selection::is_sorted(a));            // #3
    return time;
}

...
test(char * argv[])
{
    int T = std::stoi(argv[1]);          // #4
    double prev = time_trial(512);
    Std_Out::printf("%10s%10s%7s\n", "N", "Time", "Ratio");
    for (int i = 0, N = 1024; i < T; ++i, N += N) {            // #5
        double time = time_trial(N);
        Std_Out::printf("%10d%10.3f%7.1f\n", N, time, time/prev);   // #6
        prev = time;
    }
}
...

用 [0,1) 之间的实数初始化待排序数组(#1),打开计时器后执行选择排序(#2),确保得到正确的排序结果(#3)。整个测试过程要执行 T 次排序(#4)。每次执行排序的数据规模都会翻倍(#5),并以上一次排序的时间为基础计算倍率(#6),

此测试在实验环境二中完成,

$ g++ -std=c++11 -o test.out test.cpp std_out.cpp std_random.cpp stopwatch.cpp type_wrappers.cpp

$ ./test.out 8

     N      Time  Ratio
  1024     0.009    1.8
  2048     0.037    4.1
  4096     0.153    4.1
  8192     0.588    3.8
 16384     2.335    4.0
 32768     9.302    4.0
 65536    37.718    4.1
131072   156.382    4.1

可以看出,随着数据规模的成倍增长,排序所花费的时间将是上一次规模的 4 倍。将数据反映到以 2 为底数的对数坐标系中,可以得到如下图像,

test_data

Std(N^2) 代表了平方级别复杂度下的理论排序时间,该行中的数据是以 Time 行的第一个数据为基数逐一乘 4 后得到的结果(因为做的是倍率实验,所以乘 (2)^2 即 4)。

◆ 最后

完整的代码请参考 [gitee] cnblogs/18108230

写作过程中,笔者参考了 《算法(第4版)》 一书中的“排序算法类模板”和倍率实验。致作者 Sedgwick,Wayne 及译者谢路云。

标签:...,int,常见,算法,time,cpp,排序
From: https://www.cnblogs.com/green-cnblogs/p/18108230

相关文章

  • PowerShell中调用GPU命令通常涉及到与GPU相关的任务,如查看GPU信息、管理GPU驱动、执行
    PowerShell中调用GPU命令通常涉及到与GPU相关的任务,如查看GPU信息、管理GPU驱动、执行GPU加速的计算任务等。以下是一些常见的PowerShell中调用GPU命令的示例:查看GPU信息:Get-WmiObject-Namespace"root\CIMV2"-ClassWin32_VideoController:通过WMI获取GPU信息,包括名称、制......
  • 全文搜索算法问题
    l 问题描述:用关键词在数据条目列表中搜索相关条目列表,并列出匹配字列表。算法如下:将搜索关键词以字为单位分词,在数据中搜索相关条目,搜索出的条目排序规则:1) 包含字最多的条目排在前面;同一字多次匹配只计数一次2) 如果包含字数相同,条目短的排在前面3) 如果包含字数相同且......
  • Cypress----常见元素定位
    一:常用方法和函数最常用的查找元素的命令有:get|contains|find|first等等//cy.get()根据元素属性查找元素//.last()查找到多个元素的情况下,选择最后一个元素//.first()查找到多个元素的情况下,选择第一个元素//.contains('XX')元素内容为XXcy.get('i[......
  • DFS算法
    DFS,即深度优先搜索(Depth-FirstSearch),是一种用于遍历或搜索树或图的算法。它从起始节点开始,沿着树的深度尽可能远的路径探索,直到达到最深的节点,然后回溯到上一个节点,继续探索其他分支。DFS通常使用递归或栈来实现。以下是一些常见的DFS算法和应用:二叉树的DFS:在二叉树中,DF......
  • 程序员常用的几种算法
    1.排序算法:•冒泡排序(BubbleSort)•选择排序(SelectionSort)•插入排序(InsertionSort)•快速排序(QuickSort)•归并排序(MergeSort)•堆排序(HeapSort)•计数排序(CountingSort)、桶排序(BucketSort)等2.查找算法:•线性搜索(LinearSearch)•......
  • 机器学习实践篇第二篇-KNN算法学习
    一.了解什么是K-NN算法  1.KNN算法原理KNN(K-NearestNeighbor)算法是机器学习算法中最基础、最简单的算法之一。它既能用于分类,也能用于回归。KNN通过测量不同特征值之间的距离来进行分类。KNN算法的思想非常简单:对于任意n维输入向量,分别对应于特征空间中的一个点,输出为......
  • k-均值聚类算法 Primary
    目录案例——区分好坏苹果(有Key)案例——自动聚类(无Key)k-均值聚类算法(英文:k-meansclustering)定义:k-均值聚类算法的目的是:把n个点(可以是样本的一次观察或一个实例)划分到k个聚类中,使得每个点都属于离他最近的均值(此即聚类中心)对应的聚类,以之作为聚类的标准。案例——区分好坏苹......
  • 基于深度学习的疲劳检测算法
    摘要:为了实现对驾驶员驾驶状态的检测预警,避免发生交通事故。提出了一种基于改进多任务级联卷积神经网络(Multi-TaskConvolutionalNeuralNetworks,MTCNN)人脸检测及多特征融合的疲劳检测方法。算法利用改进的MTCNN进行人脸检测和面部9个特征点定位;基于特征点确定出嘴巴、眼睛......
  • 基于深度学习的咖啡豆叶片病害识别算法设计与实现任务书
    一、毕业设计(论文)课题的背景咖啡原产于非洲热带地区,距今发展己有1300多年的的历史。作为饮料,咖啡具有健胃、消食、利尿、醒脑、提神等功效。咖啡含有淀粉、糖分、脂肪和蛋白质等多种营养成分。其中小粒咖啡的主要成分含量为:粗纤维17.94、蛋白质13.86、粗脂肪11.97、淀粉6.......
  • 对二叉树深度优先遍历php算法实现的改进(先序遍历,中序遍历,后序遍历)
        树是一种数据结构,二叉树是一种特殊的树。二叉树的特点是每个结点最多有两个儿子。以某种特定顺序访问树中所有的节点称为树的遍历,今天在查看了这遍文章:https://www.cnblogs.com/ivy-zheng/p/10995492.html 中对树的遍历的实现之后我对其PHP遍历算法代码进行了重构,这次......