希尔排序, 插入排序, 冒泡排序, 选择排序【C++】

news2024/11/21 1:35:30

希尔排序, 插入排序, 冒泡排序, 选择排序

  • 测试代码
  • 希尔排序
  • 选择排序
  • 冒泡排序
  • 插入排序

测试代码

#include <iostream>
using namespace std;

int main() {

    int arr[6] = { 0 };
    int len = sizeof(arr) / sizeof(int);
    
    for (int i = 0; i < len; i++) {
        cin >> arr[i];
    }
    
    int n = 6;
    // write your code here......





    for (int i = 0; i < len; i++) {
        cout << arr[i] << " ";
    }
    return 0;
}

希尔排序

  希尔排序的实现分为两部分:

  1. 预排序, 使得整个数组接近有序。
  2. 插入排序

首先使用将数组分组gap组,元素之间间隔gap为一组

假设gap = 3;则:

在这里插入图片描述

上图中不同颜色的线将数组分成了gap组,,也就是3组。

然后每组之间进行排序:

int gap = 3;
        for(int i = 0; i < arr.size()-gap; i += gap)
        {
            int j = i;
            int t = arr[j+gap];
            while(j >= 0 && arr[j] > t)
            {
                arr[j+gap] = arr[j];
                j -= gap;
            }
            arr[j+gap] = t;
        }

上面这段代码可以将红色线的组进行排序;

在这里插入图片描述

结果如上;

现在将所有组分别进行排序:

int gap = 3;
for (int j = 0; j < gap; j ++) {
    for (int i = j; i < arr.size() - gap; i += gap) {
        int j = i;
        int t = arr[j + gap];
        while (j >= 0 && arr[j] > t) {
            arr[j + gap] = arr[j];
            j -= gap;
        }
        arr[j + gap] = t;
    }
}

自此,第一步与排序完成,得到的结果如下:

在这里插入图片描述

不过这段代码可以进行优化:

int gap = 3;
for (int i = 0; i < arr.size() - gap; i ++) {
    int j = i;
    int t = arr[j + gap];
    while (j >= 0 && arr[j] > t) {
        arr[j + gap] = arr[j];
        j -= gap;
    }
    arr[j + gap] = t;
}

对于gap,gap越小,预排序出来的数组越有序, 当gap = 1时, 就是插入排序。

越有序,插入的时候移动的次数就越少,效率就越高。

如果 gap 过小,排序过程可能会退化为类似于插入排序的方式,此时性能优势可能不再明显。

较大的 gap 可以让元素跨越较长的距离进行移动,从而更快地使数组逐渐趋向有序,减少最终的移动次数。

因此选择的是gap慢慢减小,通常使用Knuth提出的gap = [gap / 3] + 1;得到下面的代码:

int gap = arr.size();
while (gap > 1) {
    gap = gap / 3 + 1;
    for (int i = 0; i < arr.size() - gap; i++) {
        int j = i;
        int t = arr[j + gap];
        while (arr[j] > t && j >= 0) {
            arr[j + gap] = arr[j];
            j -= gap;
        }
        arr[j + gap] = t;
    }
}

选择排序

在这里插入图片描述

for(int i = 0; i < n; i++)
   {
    int t = i;
    for(int j = i+1; j < n; j++)
    {
        if(arr[j] < arr[t])
        {
            t = j;
        }
    }
    swap(arr[i], arr[t]);
   }

冒泡排序

在这里插入图片描述

bool flag = true;
   while(flag)
   {
    flag = false;
    for(int i = 1; i < n; i++)
    {
        if(arr[i-1] > arr[i])
        {
            swap(arr[i-1], arr[i]);
            flag = true;
        }
    }
   }

插入排序

在这里插入图片描述

for(int i = 1; i < n; i++)
   {
    int j = i-1;
    int key = arr[i];
    while(j >= 0 && arr[j] > key)
    {
        arr[j+1] = arr[j];
        j--;
    }
    arr[j+1] = key;
   }

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

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

相关文章

混合精度、异构计算——杂记

1、英伟达GPU架构 Figure 1 shows a full GA100 GPU with 128 SMs. The A100 is based on GA100 and has 108 SMs. SM是streaming multiprocessor的简写&#xff0c;4个处理单元组成一个SM&#xff0c;如Figure 2。 每个SM有64个INT32&#xff0c;64个FP32&#xff0c;32个F…

【Linux网络】网络层协议:IP

本篇博客整理了 TCP/IP 分层模型中网络层的 IP 协议&#xff0c;旨在让读者更加深入理解网络协议栈的设计和网络编程。 目录 一、网络层 二、IP 报头 1&#xff09;报头与有效载荷的分离 2&#xff09;有效载荷的上交 3&#xff09;源 IP 与目的 IP 4&#xff09;生存时间…

大模型学习笔记 - 大纲

LLM 大纲 LLM 大纲 1. LLM 模型架构 LLM 技术细节 - 注意力机制LLM 技术细节 - 位置编码 2. LLM 预训练3. LLM 指令微调 LLM 高效微调技术 4. LLM 人类对齐 LLM InstructGPTLLM PPO算法LLM DPO 算法 5. LLM 解码与部署6. LLM 模型LLaMA 系列7. LLM RAG 1. LLM 模型架构 大模…

奥特曼格斗进化0-3汉化版丨奈克瑟斯手机版,PC+安卓合集

今天小孩吵着要玩奈克瑟斯手机游戏&#xff0c;都是平时看那些游戏主播打这些游戏。 看着家里几千张奥特曼卡&#xff0c;脑壳就疼&#xff0c;索性还是闲鱼买了&#xff0c;因为我也没找到很全的。挨个找了个遍就不浪费时间了 百度网盘哈&#xff0c;也懒得转迅雷&#xff0c…

PXE——安装,配置,测试(rhel7环境下)

什么是PXE PXE&#xff08;Preboot eXecution Environment&#xff0c;预启动执行环境&#xff09;允许计算机在开机时从网络而非本地硬盘或其他存储设备启动。这种技术主要用于网络启动和自动化安装系统&#xff0c;尤其在需要为大量计算机同时安装操作系统的情况下非常有用。…

jupyter notebook安装

1.安装 pip install notebook 2.显示配置文件&#xff1a; jupyter notebook --generate-config 3.修改代码路径&#xff1a; 编辑配置文件C:\Users\a\.jupyterjupyter_notebook_config.py 4.运行 jupyter notebook 会自动弹出http://localhost:8888/tree

Elastic:IK分词器分词、停用词热更新如何配置-基于数据库

上一期&#xff0c;我们说明了基于API形式的热更新&#xff0c;但是API形式的热更新存在词库的管理不方便&#xff0c;要直接操作磁盘文件&#xff0c;检索页很麻烦&#xff1b;文件的读写没有专门的优化&#xff0c;性能不好&#xff1b;多一次接口调用和网络传输等缺点&#…

软件测试需要具备的基础知识【功能测试】---前端知识(一)

​ ​ 您好&#xff0c;我是程序员小羊&#xff01; 前言 为了更好的学习软件测试的相关技能&#xff0c;需要具备一定的基础知识。需要学习的基础知识包括&#xff1a; 1、计算机基础 2、前端知识 3、后端知识 4、软件测试理论 后期分四篇文章进行编写&#xff0c;这是第二篇 …

MongoDB未授权访问漏洞

开启MongoDB服务时不添加任何参数时,默认是没有权限验证的,登录的用户可以通过默认端口无需密码对数据库任意操作&#xff08;增、删、改、查高危动作&#xff09;而且可以远程访问数据库。 漏洞原因 造成未授权访问的根本原因就在于启动 Mongodb 的时候未设置 --auth 也很少…

Node.js的下一代浏览器和移动自动化测试框架-WebdriverIO

在现代软件开发中&#xff0c;自动化测试已成为保障软件质量的关键环节。而在众多测试框架中&#xff0c;WebdriverIO凭借其强大的功能和简洁的语法&#xff0c;成为Node.js生态中备受瞩目的浏览器和移动自动化测试框架。那么&#xff0c;WebdriverIO究竟有哪些独特之处&#x…

Substance Painter材质制作原理

21 材质制作原理_哔哩哔哩_bilibili 颜色&#xff0c;纹理&#xff0c;高光 木头的制作 玻璃的制作 玻璃要给一定的金属度

指标一致化处理

什么是数据指标 数据指标有别于传统意义上的统计指标&#xff0c;它是通过对数据进行分析得到的一个汇总结果&#xff0c;是将业务单元精分和量化后的度量值&#xff0c;使得业务目标可描述、可度量、可拆解。 数据指标有哪些类型 极大型:期望取值越大越好&#xff1b; 极小…

战略项目与可以帮助战略的项目

在公司内&#xff0c;如果没有机会做战略项目&#xff0c;那么就尽可能让自己的项目产生一些可以被战略项目使用的成果&#xff0c;最好是可以被多个战略项目使用的成果。 或者&#xff0c;将自己的项目和战略项目融合。 比如&#xff0c;一家生产面包的企业&#xff0c;你是负…

用PyTorch 从零开始构建 BitNet 1.58bit

我们手动实现BitNet的编写&#xff0c;并进行的一系列小实验证实&#xff0c;看看1.58bit 模型是否与全精度的大型语言模型相媲美&#xff01; 什么是量化以及为什么需要它&#xff1f; 量化是用更少的比特数表示浮点数的过程。当两个数字使用不同的比特数进行量化时&#xf…

一篇教会你PXE高效批量网络装机及kickstart无人值守安装

目录 搭建PXE的前提 搭建PEX的过程 如何构建PXE服务器 搭建本地yum源 搭建apache 创建软链接将本地yum源到apache页面下 搭建dhcp服务 dhcp配置文件如下 使用system-config-kickstart生成ks.cfg文件 &#xff0c;.cfg配置文件如下 搭建TFTP服务 搭建完成后测试 搭建…

跟李沐学AI:NiN网络中的网络

NiN块 一个卷积层后跟着两个全连接层&#xff08;实际为核窗口大小为1x1的卷积层&#xff09;。卷积层步幅为1&#xff0c;无填充&#xff0c;输出形状与卷积层输出形状相同&#xff0c;起到全连接层的作用。 NiN架构 无全连接层&#xff0c;交替使用NiN块和步幅为2的最大池化…

【C++标准模版库】list的介绍及使用

list 一.list的介绍二.list的使用1.list 构造函数2.list 空间大小3.list 增删查改4.list 迭代器的使用1.正向迭代器2.反向迭代器 5.list 其他成员函数 三.vector与list关于sort性能的比较 一.list的介绍 C中的list标准模板库&#xff08;STL&#xff09;是C标准库中的一个重要组…

Linux文件管理和IO重定向知识总结

目录 一&#xff0c;文件管理 Linux的目录结构是一个树状结构&#xff1a; 文件的分类&#xff1a; 操作文件的常用命令&#xff1a; 文件元数据和节点和inode表结构&#xff1a; 特点&#xff1a; 创建文件&#xff1a; 查看文件inode号&#xff1a; cp和inode&#x…

揭秘Matplotlib等高线图:让数据‘高山流水‘间,笑点与深度并存!

1. 引言 在这个数据如山的时代&#xff0c;你是不是也曾在茫茫数海中迷失方向&#xff0c;渴望找到那片隐藏的“数据绿洲”&#xff1f;别怕&#xff0c;今天咱们就来聊聊Matplotlib这位绘图界的魔术师&#xff0c;特别是它那令人叹为观止的等高线图技能。想象一下&#xff0c…

领域模型(Domain Model)

前言 软件的核心是其为用户解决领域相关的问题的能力。所有其他特性&#xff0c;不管有多么重要&#xff0c;都要服务于这个基本目的。当领域很复杂时&#xff0c;这是一项艰巨的任务&#xff0c;要求高水平技术人员的共同努力。开发人员必须钻研领域以获取业务知识。他们必须…