插入排序改进 将交换变成赋值语句 优点适用于近乎有序的序列

news2024/11/17 13:30:00

效果非常的明显

下面给出代码截图

再给出原代码

#include<iostream>
#include<string>
#include "Student.h"
#include "sorttesthelper.h"
using namespace std;

template<typename T >

void selectionSort( T arr[], int n){
    for(int i = 0 ; i < n ; i++){

        //寻找【i,n之间的最小值】
        int minIndex = i;
        for( int j = i + 1 ; j < n ; j++)
            if(arr[j] < arr[minIndex] )
                minIndex = j;

        swap( arr[i] , arr[minIndex]);

    }
}

//对插入排序来说,直接从第二个元素开始

template<typename T >
void InsertSort( T arr[], int n){
    for(int i = 1 ; i < n ; i++){

        T e = arr[i];

        // j 需要保存元素e应该插入的位置
        int j;
        //寻找【i应该插入的位置】,但是注意我们是从后面往前找所以j 要从后往前
        
        // for( int j = i  ; j > 0 ; j --)
        //     if(arr[j] < arr[j - 1] )
        //         swap(arr[j], arr[j-1]);
        //     else 
        //         break;
        //插入排序的优点是 可以提前 终止循环 所以对于几乎有序的序列 插入排序的性能非常强
        for( j = i  ; j > 0 && arr[j-1] > arr[e]; j --)
                arr[j] = arr[j-1];
        arr[j] = arr[e];
            

       

    }
}


int main()
{
    int a[5] = {5,62,3,58,44};
    selectionSort( a, 5 );
    for( int i = 0 ; i < 5 ; i++)
        cout<<a[i]<< " ";
    
    cout<<endl;
    
    float b[4] = {4.4,2.3,5.63};
    selectionSort( b , 3);
    for( int i = 0 ; i < 3 ; i++)
        cout<<b[i]<< " ";
    cout<<endl;

    string c[2] = {"z","b"};
    selectionSort( c , 2);
    for( int i = 0 ; i < 2 ; i++)
        cout<<c[i]<< " ";
    cout<<endl;

    Student d[3] = {{"D",90} , {"C",89} , { "B", 114}};
    selectionSort( d , 3);
    for( int i = 0 ; i < 3 ; i++)
        cout<<d[i];
    cout<<endl;


    int n = 100000;
    int *arr = SortTestHelper :: generateRandomArr(n, 0, n) ;
    int *arr2 = SortTestHelper :: copyIntArray(arr, n);
    int *arr3 = SortTestHelper :: generateNearlyorderedArr(n, 100);
    // InsertSort(arr2, n);
    // SortTestHelper :: printarr(arr2, n);
    // selectionSort( arr, n );
    // SortTestHelper :: printarr(arr, n);
    // SortTestHelper::test_sort("selection Sort", selectionSort, arr,n);
    SortTestHelper::test_sort("Insertion Sort", InsertSort, arr2,n);
    SortTestHelper::test_sort("Insertion Sort a nearly ordered arr", InsertSort, arr3,n);

    delete[] arr;
    delete[] arr2;

    return 0;

}


给出辅助文件

#ifndef SORT_HELPER_H
#define SORT_HELPER_H
//解决ide.h文件的多重引用的问题
#include <iostream>
#include <string>
#include <ctime>
#include <cassert>
using namespace std;
namespace SortTestHelper{
        //生成n个元素的随机数组,每个元素的随机范围为【rangeL, rangeR】
       int* generateRandomArr(int n, int rangeL, int rangeR){

        assert( rangeL <= rangeR );
        int *arr = new int[n];
        //设置随机种子
        srand(time(NULL));
        for(int i = 0; i < n ;i ++)
            arr[i] = rand()%(rangeR - rangeL + 1) + rangeL;

        return arr;

       }

       int* generateNearlyorderedArr(int n, int swaptimes){

     
        int *arr = new int[n];
        for(int i = 0; i < n ;i ++)
            arr[i] = i;
        //设置随机种子
        srand(time(NULL));
        for(int i = 0; i < swaptimes ; i ++){

            int posx = rand()%n;
            int posy = rand()%n;
            swap( arr[posx], arr[posy] );


        }
            

        return arr;

       }

       template<typename T >
       void printarr(T arr[], int n){
        for( int i = 0 ; i < n ; i++)
            cout<<arr[i]<< " ";
        cout<<endl;
        return;
       }

//我们也希望写一个辅助函数来帮我们判断 函数的正确性
       template<typename T >
       bool isSorted(T arr[], int n){
            for (int i = 0; i < n - 1; i++)
                if (arr[i]> arr[i+1])
                    return false;
            
            return true;

       }

       template<typename T >
    // 我们希望之后传入的都是函数名字 指针和测试用例
       void test_sort( string sortNmae, void(*sort)(T[], int), T arr[], int n){
            
            clock_t startTime = clock();
            sort(arr,n);
            clock_t endTime = clock();

            assert( isSorted(arr, n ));
            //每一秒中时钟周期运行的个数  最后输出的程序 运行的多少秒
            cout<< sortNmae << " : "<<double(endTime - startTime)/ CLOCKS_PER_SEC << " s " <<endl;

            return;

       }

       int* copyIntArray(int a[], int n){
        
        int* arr = new int[n];
        copy(a, a + n, arr);
        
        return arr;
       }
       
}






#endif //SORT_HELPER_H

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

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

相关文章

MATLAB——Decision Tress决策树程序

给个关注呦&#xff01;欢迎关注微♥公众号“电击小子程高兴的MATLAB小屋”&#xff0c;海量资源等你来呦&#xff01; 光储直流微电网MATLAB/Simulink仿真 光伏PV三相并网逆变器 %% I. 清空环境变量 clear all clc warning off %% II. 导入数据 第一列是序号 第二…

让你至少拿2份offer的软件测试面试题来了(100题带标准答案)

一、自我介绍 二、灵活问题 1、大概说说之前公司的测试流程 2、测试报告有哪些内容? 3、如何保证用例的覆盖度&#xff1f; 4、什么是测试用例&#xff0c;什么是测试脚本&#xff1f;两者的关系 5、Bug的级别&#xff0c;按照什么划分 6、你认为是bug&#xff0c;开发认…

微信小程序开发的OA会议之会议,投票,个人中心的页面搭建及模板,还有自定义组件的学习

目录 一、自定义组件 1. 创建 2. 定义 3. 编写 4. 使用 二、会议 1. 数据 2. 显示 3. 样式 三、个人中心 1. 页面 2. 样式 四、投票 1. 引用 2. 数据 3. 页面 4. 样式 每篇收获 一、自定义组件 开发者可以将页面内的功能模块抽象成自定义组件&#xff0c;以…

国外访问学者面签技巧

当涉及国外访问学者的面签时&#xff0c;提前准备和掌握一些技巧可以大大增加成功的机会。本文知识人网小编将为您介绍一些关键的面签技巧&#xff0c;帮助您在国外访问学者面签中表现出色。 1.详细准备材料&#xff1a;在面签前&#xff0c;确保您已经准备好所有所需的文件和材…

乙酰基四肽-3/Acetyl Tetrapeptide-3——刺激毛囊,长出新头发,有效防止秃头

社会对头发很着迷。从圣经人物参孙&#xff08;他从头发中获得力量&#xff0c;并说如果剃光头他就会失去力量&#xff09;&#xff0c;到社交媒体上无休无止地谈论名人的标志性风格&#xff0c;头发是一个永恒的话题。 为什么痴迷&#xff1f;好吧&#xff0c;我们的头发是外…

分布式事务及CAP和BASE顶底

一、分布式事务 单体应用肯定就不存在分布式事务了&#xff0c;只有在分布式微服务系统中&#xff0c;各个服务之间通过RPC调用后&#xff0c;每个微服务有自己和数据库的连接&#xff0c;各个微服务的回滚不影响其他的微服务事务&#xff0c;这几必须使用分布式事务来解决分布…

2022年京东双十一家用电器全品类数据回顾

2023年双十一临近&#xff0c;特此带大家回顾一下去年双十一热门品类的一些战况数据。 由于涉及到热门细分品类众多&#xff0c;会分为多篇内容。 本篇先从京东家用电器品类说起。 2022年双11期间&#xff0c;京东家用电器累计销量2960万件&#xff0c;累计销售额约280亿元&…

2023下半年软考考试方式、考试时间和批次安排!(附加模拟系统绘图操作说明)

注意了下半年考试的伙伴们&#xff01;官方发了通告了&#xff01; 按照《2023年下半年计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试有关工作调整的通告》&#xff0c;自2023年下半年起&#xff0c;计算机软件资格考试方式均由纸笔考试改革为计算机化考试。 …

便携式电源,移动电源,电源组,便携式汽车应急启动电源的适用范围是什么?合规标准是什么?如何办理?

便携式电源&#xff0c;移动电源&#xff0c;电源组&#xff0c;便携式汽车应急启动电源的适用范围是什么&#xff1f;合规标准是什么&#xff1f;如何办理&#xff1f; 一、亚马逊的便携式电源&#xff0c;移动电源&#xff0c;电源组&#xff0c;便携式汽车应急启动电源的适…

海思Hi3519DV500边缘计算盒子-英码IVP09A,双核A55 64位处理器

产品简介 IVP09A是英码科技推出的边缘计算智能工作站&#xff0c;搭载双核 Cortex-A55 架构AI 处理器&#xff1b;内置高效的神经网络推理引擎&#xff0c;提供2.5TopsNPU算力;支持多路视频图像识别硬件加速。IVP09A&#xff0c;高效能低成本、稳定易开发、多点布线、联网管控…

FPGA驱动SDRAM

文章目录 一.SDRAM简介&#xff08;手册分析&#xff09;1.1存储空间1.2特征1.3引脚1.4内部结构1.5需要关注的一些时间1.6模式寄存器1.7命令真值表 二.时序分析&#xff08;手册分析&#xff09;2.1Avalon时序2.2行激活时序2.3列读写时序2.4读数据2.5写数据 三.初步设计3.1状态…

冒泡排序给cpu干懵了 哈哈 还有希尔排序 算法补充(学习笔记)

直接给出代码 #include<iostream> #include<string> #include "Student.h" #include "sorttesthelper.h" #include "BubbleSort.h" using namespace std;template<typename T> void shellSort(T arr[], int n){// 计算 incr…

Nginx+keepalived 高可用双机热备—双主模式

双机高可用方法目前分为两种&#xff1a; 1&#xff09;Nginxkeepalived 双机主从模式&#xff1a;即前端使用两台服务器&#xff0c;一台主服务器和一台热备服务器&#xff0c;正常情况下&#xff0c;主服务器绑定一个公网虚拟IP&#xff0c;提供负载均衡服务&#xff0c;热备…

什么是客户端?一文了解客户端定义、特点与功能、搭建方法

客户端&#xff1a;定义、特点与功能、搭建方法 1. 定义&#xff1a; 客户端是计算机网络中的一个术语&#xff0c;指的是在网络通信中充当主动发起请求并接收服务响应的一方。通常&#xff0c;客户端是指运行在终端设备上的软件或硬件实体&#xff0c;通过与服务器进行通信来…

从实体经济和数字经济融合展开,思考商业模式的变化

对于《关于构建数据基础制度更好发挥数据要素作用的意见》想必大家已经不陌生了&#xff0c;之前的文章中也围绕数据要素说了很多东西&#xff0c;数据、数字化、数字经济之类的已经称得上是绝大部分人对未来发展方向的共识&#xff0c;不过今天想从这个《意见》出发&#xff0…

电脑开不了机用U盘重装系统Win10教程

如果我们遇到了电脑开不起机的问题&#xff0c;这给我们的正常使用带来了很大的影响。这时候我们可以借助U盘重装系统的方法&#xff0c;轻松应对这一问题。下面小编给大家详细介绍关于用U盘给开不机的电脑重装Win10系统的教程步骤&#xff0c;操作后用户就能正常使用电脑了。 …

Mac 远程桌面软件

对于使用 Mac 计算机和笔记本电脑的企业来说&#xff0c;适用于 Mac 的远程桌面软件变得越来越重要&#xff0c;随着远程工作变得越来越普遍&#xff0c;IT 管理员和组织需要一种安全的方式来访问和修复问题、处理紧急任务以及监控远程工作站的状态&#xff0c;为了促进远距离协…

结构体和联合体详解

结构体和联合体详解 1.结构体struct1.1 结构体struct的设计1.2 结构体struct变量的定义和初始化举例&#xff1a;使用结构体Student定义并初始化stu1变量。举例&#xff1a;结构体嵌套的初始化方法。 1.3 结构体struct成员变量的访问&#xff08;获取与赋值&#xff09;1.3.1 使…

科研宝典·工具篇 | CiteSpace: 科学文献分析

​文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体&#xff0c;注重量化的综合性知识体系。特别是&#xff0c;信息可视化技术手段和方法的运用&#xff0c;可直观的展示主题的研究发展历程、研究现状、研…

小度打头阵,百度大模型能否“赋能万物”?

文 | 智能相对论 作者 | 楷楷 近日&#xff0c;百度集团副总裁、小度科技原CEO景鲲因个人原因辞任&#xff0c;百度集团副总裁、首席信息官&#xff08;CIO&#xff09;李莹轮岗出任小度科技CEO&#xff0c;并向李彦宏直接汇报。 随着“景鲲时代”落幕&#xff0c;新任CEO李…