当前位置: 首页 > news >正文

排序算法之选择排序

排序算法之选择排序

1.选择排序介绍

选择排序分为三种,直接选择排序、树形选择排序、堆排序。直接选择排序和堆排序是不稳定排序,树形选择排序是稳定排序。在这里介绍的是直接选择排序。其他的后面再分析。

直接选择排序算法思想:第一趟从n个元素的数据序列中选出关键字最小/大的元素并放在最前/后位置,下一趟从n-1个元素中选出最小/大的元素并放在最前/后位置。以此类推,经过n-1趟完成排序。

2.选择排序算法分析

直接选择排序的最好时间复杂度和最差时间复杂度都是O(n²),因为即使数组一开始就是正序的,也需要将两重循环进行完,平均时间复杂度也是O(n²)。空间复杂度为O(1),因为不占用多余的空间。直接选择排序是一种原地排序(In-place sort)并且定(stable sort)的排序算法,优点是实现简单,占用空间小,缺点是效率低,时间复杂度高,对于大规模的数据耗时长。

算法步骤:
  • 第1趟,在待排序记录r[1]~r[n]中选出最小的记录,将它与r[1]交换;
  • 第2趟,在待排序记录r[2]~r[n]中选出最小的记录,将它与r[2]交换;
  • 以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕

3.选择排序算法从实现到优化

V1.0

template <typename T>
void SelectionSort2(T a[], int len)
{
    for(int i = 0; i < len; i++) {
        int MinIndex = i;
        for(int j = i+1; j < len; j++) {
            if(a[MinIndex] < a[j]) {
                MinIndex = j;
            }
        }
        swap(a[MinIndex], a[i]);
    }
}

4.选择排序多种场景下的测试

int main() {
    int N = 20000;

    //稀疏数组,随机性大
    int *arr1 = SortTestHelper::CreateRandomArray(N, 0, 1000000);
    SortTestHelper::testSort("SelectionSort", SelectSortFunc::SelectionSort2, arr1, N);

    //近乎有序
    int *arr2 = SortTestHelper::CreateRandomArray(N, 0, 100);
    SortTestHelper::testSort("SelectionSort", SelectSortFunc::SelectionSort2, arr2, N);

    //基本有序
    int *arr3 = SortTestHelper::CreateRandomArray(N, 0, 10);
    SortTestHelper::testSort("SelectionSort", SelectSortFunc::SelectionSort2, arr3, N);

    delete[] arr1;
    delete[] arr2;
    delete[] arr3;
    return 0;
}
测试结果:

SelectionSort : 0.424071s
SelectionSort : 0.416928s
SelectionSort : 0.410701s

根据结果表明,选择排序是一种稳定的排序算法,在随机性很大和近乎有序,有序的情况下算法的时间复杂度基本不变。但是这也是一个劣势,效率较差。

转载于:https://www.cnblogs.com/liangjf/p/8764474.html

相关文章:

  • PostgreSQL入门及提权
  • 面向对象1
  • Lambda表达式(Java)
  • 区块链将会怎样颠覆Google、Amazon、Facebook和Apple?
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • Windows Server 2012的服务管理自动化 -启动类型设置,手动启动还是自动启动
  • JVM 组成以及各部分作用
  • PHP 500报错的快速解决方法
  • windows网络模型之完成端口(CompletionPort)详解 (转)
  • [转]区块链代码快速学习实践
  • 《王牌特工2》情景再现,Youbionic推出可穿戴式机械手
  • 扩展GenericServlet实现Servlet程序 学习笔记
  • HTTP协议-HTTP响应报文
  • 《以太坊白皮书》笔记(3)—— 以太坊介绍. 下
  • zookeeper的开启启动
  • @angular/forms 源码解析之双向绑定
  • 4. 路由到控制器 - Laravel从零开始教程
  • Apache Zeppelin在Apache Trafodion上的可视化
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • Java基本数据类型之Number
  • Linux各目录及每个目录的详细介绍
  • overflow: hidden IE7无效
  • React中的“虫洞”——Context
  • storm drpc实例
  • vue.js框架原理浅析
  • 给Prometheus造假数据的方法
  • 关于List、List?、ListObject的区别
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 回顾2016
  • 每天一个设计模式之命令模式
  • 模型微调
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 前端性能优化--懒加载和预加载
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • Linux权限管理(week1_day5)--技术流ken
  • # Panda3d 碰撞检测系统介绍
  • #Spring-boot高级
  • #Z0458. 树的中心2
  • #传输# #传输数据判断#
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)用.Net的File控件上传文件的解决方案
  • ***原理与防范
  • .gitignore
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .Net多线程总结
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .so文件(linux系统)