常用排序算法哪个效率更高之从理论到实践

news2024/11/18 11:18:02

前面整理了一篇关于排序算法的基础类库:基本排序算法类SortHelper

这里我们来看看这几个算法哪个效率更高一点呢?

1、先从理论来看看这几个算法

1、冒泡排序法

基本思想:两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。

2、插入排序法

基本思想:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

3、选择排序法

基本思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

4、希尔排序法

基本思想:先 取一个小于n的证书d1作为第一个增量,把文件的全部记录分成d1组。所有距离为d1的倍数的记录放在同一组中。先在各组内进行直接插入排序,然后取第二 个增量d2<d1重复上述的分组和排序,直到所取的增量dt=1,即所有记录放在同一组中进行直接插入排序为止。该方法实际上是一种分组插入方法。

2、写个程序来看看上面几个算法的效率怎么样

1、先看结果,随机生成一个包含20000个不重复的整数数组进行排序,记录每种排序算法的耗时情况如下:

从输出结果可以看出来,效率最低的是冒泡算法

 2、源码分一下几个部分:

2.1 主方法如下

static void Main(string[] args)
{
    Console.WriteLine("冒泡排序法,插入排序法,选择排序法,希尔排序法");
    for (int i = 0; i < 10; i++)
    {
        SortAction(i);
    }
    Console.Read();
}

2.2 调用排序算法的方法如下

public static void SortAction(int i)
{
StringBuilder sb = new StringBuilder();
sb.Append("第"+i+"次耗时,");
int[] list = GenerateUniqueRandom(1, 100000, 20000);
int[] list1 = (int[])list.Clone();
int[] list2 = (int[])list.Clone();
int[] list3 = (int[])list.Clone();
int[] list4 = (int[])list.Clone();

Stopwatch sw = new Stopwatch();
//冒泡排序法
sw.Start();
SortHelper.BubbleSort(list1);
sw.Stop();
//Console.WriteLine("冒泡排序法用时:" + sw.ElapsedMilliseconds + "");
sb.Append(sw.ElapsedMilliseconds +",");

sw.Reset();
sw.Restart();
//插入排序法
SortHelper.InsertionSort(list2);
sw.Stop();
//Console.WriteLine("插入排序法用时:" + sw.ElapsedMilliseconds + "");
sb.Append(sw.ElapsedMilliseconds + ",");

sw.Reset();
sw.Restart();
//选择排序法
SortHelper.SelectionSort(list3);
sw.Stop();
//Console.WriteLine("选择排序法用时:" + sw.ElapsedMilliseconds + "");
sb.Append(sw.ElapsedMilliseconds + ",");

sw.Reset();
sw.Restart();
//希尔排序法
SortHelper.ShellSort(list4);
sw.Stop();
//Console.WriteLine("希尔排序法用时:" + sw.ElapsedMilliseconds + "");
sb.Append(sw.ElapsedMilliseconds + ",");
Console.WriteLine(sb);
}

通过Stopwatch记录每次排序的时间消耗,为了避免排序的偶然性,取了10次不同的数组进行排序

2.3 获取包含不重复的随机数组的方法如下

/// <summary>
/// 获取不重复的随机数组
/// </summary>
/// <param name="minValue">最小值</param>
/// <param name="maxValue">最大值</param>
/// <param name="n">数组长度</param>
/// <returns></returns>
public static int[] GenerateUniqueRandom(int minValue, int maxValue, int n)
{
    //如果生成随机数个数大于指定范围的数字总数,则最多只生成该范围内数字总数个随机数
    if (n > maxValue - minValue + 1)
        n = maxValue - minValue + 1;

    int maxIndex = maxValue - minValue + 2;// 索引数组上限
    int[] indexArr = new int[maxIndex];
    for (int i = 0; i < maxIndex; i++)
    {
        indexArr[i] = minValue - 1;
        minValue++;
    }

    Random ran = new Random();
    int[] randNum = new int[n];
    int index;
    for (int j = 0; j < n; j++)
    {
        index = ran.Next(1, maxIndex - 1);// 生成一个随机数作为索引
        //根据索引从索引数组中取一个数保存到随机数数组
        randNum[j] = indexArr[index];
        // 用索引数组中最后一个数取代已被选作随机数的数
        indexArr[index] = indexArr[maxIndex - 1];
        maxIndex--; //索引上限减 1
    }
    return randNum;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/111255.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RSA和AES的使用

文章目录为什么要对数据传输加密对称加密和非对称加密密钥的几种格式非对称加密算法----RSA算法产生公私密钥对对称加解密算法AES为什么要结合使用这两种算法利用RSA来加密传输AES的密钥&#xff0c;用AES来加密数据&#xff0c;思路如下&#xff1a;特点分析&#xff1a;参考链…

【探索Spring底层】14.谈谈参数解析器

文章目录1. 参数解析器概述2. 常见参数的解析1. 参数解析器概述 参数解析器是Spring-Web包提供的组件&#xff0c;并且SpringMVC中提供了很多参数解析器。 常见的参数解析器如下 org.springframework.web.method.annotation.RequestParamMethodArgumentResolverabbc908org.s…

部署并启动项目在linux(CentOS7)上,一名合格的程序猿不能不会(ಥ_ಥ)

各位小伙伴大家好呀哈哈哈~ 遇到问题不要慌─≡Σ(((つ•̀ω•́)つ让我先发个朋友圈~( • ̀ω•́ )✧ 我们知道项目的正常运行是需要先部署在服务器上&#xff0c;然后才能正常使用&#xff0c;我们一般都是在idea下写好然后直接部署在tomcat上或者其他服务器&#xff0c;但…

多维表需求管理表自动生成TAPD需求

【实现效果&#xff1a;】业务同学使用多维表管理客户需求&#xff0c;和产品团队经过评审之后&#xff0c;一键把多维表里对应的需求生成TAPD需求/缺陷单 【准备工作】 准备一个多维表&#xff0c;比如维格表、金山轻维表等 可以参考这两个模版&#xff1a; 金山轻维表&am…

【深入浅出Spring原理及实战】「开发实战系列」Aspectj和LoadTimeWeaving的动态代理技术实现指南

前提介绍 当我们聊到Spring框架的项目实际开发中&#xff0c;用的强大的功能之一就是&#xff08;面向切面编程&#xff09;的这门AOP技术。如果使用得当&#xff0c;它的最大的作用就是侵入性比较少并且简化我们的工作任务&#xff08;节省大量的重复性编码&#xff09;&…

【QT】PySide6 数据可视化折线图

一、项目介绍 本项目将通过PySide6构建一个可以显示数据折线图的可视化程序&#xff0c;其中&#xff0c;数据来源时美国地质调查局(US Geological Survey)上公开的一小时地震震级数据。 可以通过链接进行下载。 二、实现步骤 本项目的实现步骤可以概括为&#xff1a; 读取…

艾美捷过氧化氢酶检测试剂盒的功能和应用

过氧化氢酶&#xff08;EC 1.11.1.6&#xff1b;2H2O2氧化还原酶&#xff09;是一种普遍存在于大多数需氧细胞中的抗氧化酶。过氧化氢酶&#xff08;CAT&#xff09;参与过氧化氢&#xff08;H2O2&#xff09;的解毒&#xff0c;过氧化氢是一种活性氧&#xff08;ROS&#xff0…

领域首创!合合信息与上海大学联合开启贵州原生态古彝文典籍数字化项目

古彝文传承至今已有数千年历史&#xff0c;是世界上最古老的文字之一。2022年12月21日&#xff0c;合合信息与上海大学社会学院正式签署校企合作协议&#xff0c;双方将合力完成以国家珍贵古籍《西南彝志》为中心的贵州古彝文图像识别及数字化校对项目&#xff08;简称“古彝文…

搜索与图论---最短路

最短路:建图! 源点—起点汇点—终点约定n为点数,m为边数1单源最短路:求一个点到其他所有点的最短路 1.1所有边权都是正数 (1)朴素的Dijkstra算法(On^2) 例题:Dijkstra求最短路 I 代码: #include<iostream> #include<cstring> #

代码随想录算法训练营第42天 | 01背包问题 416. 分割等和子集

01背包问题 由于leetcode上没原题&#xff0c;故参考卡哥意见自己编题记录一下。 一、题干 背包最大重量为4。物品为&#xff1a; 物品名称重量价值011513202430––– 问背包能背的物品最大价值是多少&#xff1f; 二、解法 二维dp&#xff1a; 递推公式&#xff1a;dp[i…

数组方法中会更改原数组,不会更改原数组(详细)

1.不会改变原来数组的有&#xff1a; concat() 连接两个或更多的数组&#xff0c;并返回结果。 如果arr.concat&#xff08;&#xff09;里面不放数组参数&#xff0c;则会浅拷贝arr 如果参数不是数组&#xff0c;它不会递归到嵌套数组参数中 数据类型如字符串&#xff0c;数…

elasticsearch小白入门

一般再项目中都会用到 搜索&#xff0c;如果直接查询数据库&#xff0c;性能会存在瓶颈。 这时&#xff0c;用ES就很好的解决这个问题。 ES组件很多&#xff1a;包括 elasticsearch kibana beats logstash 安装 elasticsearch 下载&#xff1a; Elasticsearch 7.10.2 | El…

SpringBoot项目搭建+登录功能实现(小结)

项目目录 登录功能实现思路 目录 1.pom.xml添加依赖 2.配置application.yml文件 3.sql映射文件配置---UserMapper.xml 4.导入页面资源 5.Springboot启动类的配置 6.编写全局配置类 config->AppConfig 7.创建实体类--数据表对应 8.修改login.html页面 9.编写UserCo…

基于SpringBoot的SSMP整合案例

基于SpringBoot的SSMP整合案例 简介&#xff1a;SSMP(SpringSpringMVCMyBatis)&#xff0c;通过SpringBoot整合SSMP来完成增删改查案例。 功能开发模块 实体类开发————使用Lombok快速制作实体类Dao开发————整合MyBatisPlus&#xff0c;制作数据层测试Service开发——…

如意如意猿如意

如意如意猿如意什么是猿如意猿如意效率工具JSON编辑器jsontojava开发工具ChatGPT推荐指数评分及改进意见UI界面效率工具和开发工具ChatGPT一行代码总结经常听到一句话&#xff1a;如意如意随我心意&#xff0c;作为程序猿&#xff0c;我也想要一个如意&#xff0c;心中默念咒语…

LeetCode-91-解码方法

1、动态规划法 我们可以使用动态规划法来解决本问题。我们利用数组dp[i]dp[i]dp[i]来记录字符串前iii位能够组成的解码方法总数。在设计状态转移方程时&#xff0c;我们需要注意这样子的特殊情况&#xff1a;1、当s[i]s[i]s[i]不为0时&#xff0c;单独一个s[i]s[i]s[i]肯定能够…

PID算法总结-从公式原理到参数整定解析

目录 一、控制系统 1.1控制系统的分类 1.2 性能指标 二、PID算法的起源及特点 三、PID应用 四、PID公式原理 五、PID源码 六、PID整定方法 6.1 经验法 6.2 衰减曲线法 6.3 响应曲线法 参考文献&#xff1a; 一、控制系统 1.1控制系统的分类 分为开环控制、闭环控制和复…

Axios(二)

1.axios的基本使用 <!doctype html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, minimum-scale1.…

前端基础_像素的处理

像素的处理 在HTML5中使用canvas API所能够做到的图像处理技术中&#xff0c;还有一个更让人惊讶的技术就是像素处理技术。使用canvas API能够获取图像中的每一个像素&#xff0c;然后得到该像素颜色的rgb值或rgba值。 使用图形上下文对象的getImageData方法来获取图像中的像…

Docker安装Nginx 反向代理服务器

前端代码扔在服务器上怎么运行&#xff0c;首先安装Nginx&#xff0c;这里我用Docker安装Nginx 文章目录一、安装nginx docker镜像1、 获取nginx官方镜像2、查看镜像库3、宿主机创建好要挂载的目录4、启动一个不挂载的容器5、配置文件挂载到宿主机6、停止/删除容器7、查看宿主机…