自己动手实现数据结构——排序算法2 (希尔、快速、堆)(C++实现)

数据结构各类排序算法详解+代码分析 数据结构各类排序算法详解+代码分析 前言 不知不觉,数据结构已经学完了,博主也马上大二了????时间过得太快了????,但是数据结构学得确实不太好,楼主花了将近一天的时间整理了一下排序的有关算法。希望对大家也有所帮助。 目录数据结构各类排序算法详解+代码分析前言插入排序基本思想直接插入排序折半插入排序二路排序希尔排序快速排序选择排序基本思想简单选择排序锦标赛排序堆排序堆定义建堆堆排序算法代码解析归并排序基数排序总结排序方法比较方法选择写在后面 插入排序 基本思想 每步将一个待排序记录,按其关键码大小,插 阅读详情

希尔排序

又称缩小增量排序

先给数组设定一个增量,一般数组长度为len,同常将增量设为increment = len/2,increment每次缩小为原来的1/2。

1、通过这个增量给数组里的数分组:例如 0,0+increment, 0+2*increment,... 为一组   1,1+increment, 1+2*increment,...为另外一组。

2、对于每一个组通过插入算法进行排序。(前面已经写了折半插入排序,这里写的是普通插入排序)

3、increment = increment/2,然后继续循环

代码:shell_sort.cc

#include<iostream>
#include<vector>
using namespace std;


template< class T >
void shell_sort(vector<T> &a){
    int len = a.size();
    int i,j;
    T tmp;
    int increment;
    for ( increment = len/2; increment >0; increment /= 2){
        for ( i = increment; i < len; i++){
            tmp = a[i];
            for ( j = i; j >=increment; j -= increment){
                if ( tmp < a[j - increment] )
                    a[j] = a[ j - increment];
                else{
                    break;
                }
            }
            a[j] = tmp;
        }
    }
}

int main(int argc, char **argv){
    vector<int> a = {10, 8, 9, 1, 7, 4, 11, 23, 3, 2, 5};
    vector<int>::iterator iter;

    shell_sort<int>( a );

    for( iter = a.begin(); iter != a.end(); iter++){
        cout<< *iter <<" ";
    }
    cout << endl;
    return 0;
}
运行结果:

jdh@jdh-virtual-machine:~/program/datastruct/c_plus/sort$ ./a.out
1 2 3 4 5 7 8 9 10 11 23

快速排序

#include<iostream>
#include<vector>
using namespace std;


template<class T>
int partition(vector<T> &a, int left, int right){
    int i = left;
    int j = right;
    T key = a[right];

    for( j = left; j < right; j++){
        if ( a[j] < key ){
            swap(a[j], a[i]);
            ++i;
        }
    }
    swap(a[i] , a[right]);
    return i;
}

template<class T>
void quick_sort(vector<T> &a, int left, int right){
    if ( left < right){
        int q = partition(a, left, right);
        quick_sort(a, left, q-1);
        quick_sort(a, q+1, right);
    }
}

int main(int argc, char **argv){
    vector<int> a = {10, 8, 9, 1, 7, 4, 11, 23, 3, 2, 5};
    int len = a.size();
    vector<int>::iterator iter;

    quick_sort<int>(a, 0, len-1); 

    for( iter = a.begin(); iter != a.end(); iter++){
        cout<< *iter <<" ";
    }
    cout << endl;

    return 0;
}
运行结果:

jdh@jdh-virtual-machine:~/program/datastruct/c_plus/sort$ g++ -std=c++11 quik_sort.cc
jdh@jdh-virtual-machine:~/program/datastruct/c_plus/sort$ ./a.out
1 2 3 4 5 7 8 9 10 11 23

堆排序

性质:

1、二叉堆在逻辑上是一个完全二叉树,但是我们可以采用数组的方式存储。

如果二叉堆数组从1开始存储,那么父亲i的左孩子下标为2i,右孩子下标为2i+1;同理结点i的父亲下标为i/2。

如果二叉堆数组从0开始,则父结点i左孩子的下标为2i+1,右孩子的下标2i+2.

2、小根堆,一个结点的权值小于其所在在子树其它结点的权值。

大根堆,一个结点的权值大于其所在子树其它结点的权值。


堆排序步骤;

1、将普通数组转换成大根堆数组

2、 a.将大根堆的第一个数和数组的最后一个数交换,修正除了最后一个数以外其余数的大根堆性质

      b.重复a的步骤

#include<iostream>
#include<vector>
using namespace std;


inline int left(int i){
    return 2*i+1;
}

inline int right(int i){
    return 2*i+2;
}

template<class T>
void build_child_max_heap(vector<T> &a, int i, int len){
    int max = i;
    if ( left(i) < len ){
        if ( a[i] < a[left(i)])
            max = left(i);
    }
    if ( right(i) < len){
        if ( a[right(i)] > a[max] )
            max = right(i);
    }
    if ( max != i){
        swap(a[max], a[i]);
        build_child_max_heap(a, max, len);
    }
}



template<class T>
void build_max_heap(vector<T> &a){
    int len = a.size();
    for ( int i = (len-1)/2; i >= 0; --i)  
        build_child_max_heap(a, i, len);
}

template<class T>
void heap_sort(vector<T> &a, int len){
    build_max_heap(a);
   for ( int i = len - 1; i > 0; --i){
       swap(a[0], a[i]);
        build_child_max_heap(a, 0, i);
    }
}

int main(int argc, char **argv){
    vector<int> a = {6, 8, 9, 1, 7, 4, 11, 23, 3, 2, 5};
    int len = a.size();
    vector<int>::iterator iter;

    heap_sort(a, len);

    for( iter = a.begin(); iter != a.end(); iter++){
        cout<< *iter <<" ";
    }
    cout << endl;

    return 0;
}

运行结果:

jdh@jdh-virtual-machine:~/program/datastruct/c_plus/sort$ g++ -g -std=c++11 heap_sort.cc
jdh@jdh-virtual-machine:~/program/datastruct/c_plus/sort$ ./a.out
1 2 3 4 5 6 7 8 9 11 23



经典排序算法C++实现(10种) C++实现经典排序算法插入排序希尔排序(缩小增量排序)选择排序堆排序冒泡排序冒泡排序的原理:快速排序合并排序折中排序新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章U... 阅读详情

相关推荐

经典排序算法C++全实现:插入、选择、冒泡、快排、归并、基数,堆排、希尔...

以下代码是个人学习排序算法的一些实践,实现了大部分排序算法的升序版本,并且对每一种算法进行了简要的介绍和复杂度分析。 涉及的算法如下: 插入排序:直接插入排序、折半插入排序、希尔排序 交换排序:冒泡排序、快速排序 选择排序:简单选择排序、堆排序 其他类型:归并排序、基数排序 #include <iostream> #include <string> #include &...

湫一 853

数据结构-排序基础代码

数据结构-排序基础代码

IT1995的博客 5655

C++实现四大排序算法:希尔、快排、堆排、归并原理与代码

排序算法是数据结构与算法体系中的基石,其时间复杂度、稳定性以及额外空间开销直接影响程序在真实场景中的性能表现。在C++工程实践中,面对不同规模与特征的数据,合理选择并手写实现排序逻辑是开发者应具备的核心能力。本文从排序的基本评价维度出发,辨析希尔排序、快速排序、堆排序与归并排序的适用边界,并深入拆解各自的分治思想、堆维护流程与边界控制细节。通过对比标准库sort的混合策略,强调理解多趟插入、递归分区、向下调整与归并合并等底层机制对解决笔试面试和实际项目难题的价值。同时给出全等数组死循环、建堆越界、辅助数组频

weixin_34094282的博客 241

【数据结构】八大排序算法-代码实现+复杂度分析+稳定性分析+总结

注意:1.对于快速排序:如果加了三数取中 + 三路归并 最坏就不是O(N^2)2.为了绝对的速度选快排,为了省空间选堆排,为了稳定性选归并3.时间复杂度:O(N*logN),额外空间复杂度低于O(N),且稳定的基于比较的排序是不存在的。

chuxinchangcun的博客 1603

华为云CodeHub代码托管

什么是代码托管 代码托管(CodeHub)是面向软件开发者的基于Git的在线代码托管服务,是具备安全管控、成员/权限管理、分支保护/合并、在线编辑、统计服务等功能的云端代码仓库,旨在解决软件开发者在跨地域协同、多分支并发、代码版本管理、安全性等方面的问题。 代码托管具有以下特性 · 在线代码阅读、修改、提交,随时随地开发,不受地域限制。 · 在线分支管理,包含分支新建、切换、合并,实现多分支并行开发,效率高。 master分支:最为稳定,功能比较完整,随时可发布的代码。 develop分支:用于平时开

LUJINYUANA的博客 1万+

手把手教你用Apollo Dreamview调试自动驾驶感知模块(附数据包下载)

本文详细介绍了如何使用百度Apollo平台的Dreamview工具调试自动驾驶感知模块,包括环境配置、数据加载、感知问题定位和多传感器融合调试等关键步骤。通过实战案例和参数调整技巧,帮助开发者快速掌握自动驾驶感知模块的调试方法,提升开发效率。

weixin_29084111的博客 139

【数据结构】——八大排序(详解+图+代码详解)看完你会有一个全新认识

排序在生活中是非常重要的,所以排序在数据结构中也占有很大的地位,相信大家可能被这些排序弄得比较混淆或者对某个排序原理没有弄清,相信看完本篇会对你有所帮助!排序的概念与应用排序概念排序:排序就是使一串数据,按某个或者某些关键字的大小,递减或者递增排列起来的操作稳定性:在排序的过程中,可能存在两个或者以上的关键字相等的记录,排序的结果可能会不一样,这里就分成了稳定和不稳定。

m0_74092462的博客 2122

【MFiX后处理】MFiX中使用des_usr_var输出颗粒的传热量(2020-11-27更新变更输出变量名方法)

参考之前Yin的那一篇博客 https://www.cnblogs.com/Jay-CFD/p/10621274.html 输出一下颗粒传热量 使用的算例是fluid_bed_dem_2d 打开des scalar tracking 前面都和Yin那篇一样,打开enable user scalar tracking 输入2 因为第一个用来测试Y加速度了 第二个输出传热量 然后在output vtk中勾选好 更改源代码 源代码为des_thermo_newvalues.f 在mfix-GUI自带的ed

beidou111的博客 1533

数据结构与算法:12种排序全代码

排序 文章目录排序1.冒泡排序思路:优化:交换过程:C语言代码:优化后:2.直接插入排序思路:过程:代码:3.折半插入排序折半查找代码4.希尔插入排序思路:排序过程:代码5.选择排序思路:排序过程:代码6.鸡尾酒排序法思路:代码7.堆排序思路:代码8.归并排序思路:代码9.快速排序思路:代码10.计数排序思想:代码11.桶排序思路:代码12.基数排序思路过程:代码代码 各种排序算法的时间复杂度和空...

qq_42667970的博客 3024

Zabbix监控网络设备讲解

Zabbix监控网络设备讲解 本人在研究学习zabbix的时候,网上找过很多如何监控路由,交换,或者是防火墙的文章,但很多都比较散,这里我出一个大概的整合,方便大家参考和学习。本章就拿华三的交换机来做文章。 监控网络设备首先我们需要开启snmp协议,华三怎么开启snmp协议在我的博客里有写到,其次就是找到版本对应的OID,zabbix就是通过抓取设备的OID来做到监控网络设备的,当然zabbix也不仅仅只有通过snmp来监控设备,还有很多别的功能,这些功能我会在以后的博客里面一一更新 文章目录Zab

太阳了文哥的博客 3382

EMD (经验模态分解) 在 C++ 中的实现指南

EMD 是由 Norden E. Huang 等人在1998年提出的一种适用于非线性和非平稳信号的分析方法。对称性:IMF 的上下包络对称。零交叉点:IMF 的零交叉点数量与极值点数量相同或相差一个。本文详细介绍了如何在C++中实现EMD,包括理论背景、算法步骤、代码实现和优化等内容。通过丰富的代码示例和详细的解释,希望能够帮助读者掌握EMD的基本原理,并能够在实际项目中灵活应用。未来,随着信号处理技术的不断发展,EMD及其变种(如EEMD、CEEMDAN等)将继续在各个领域发挥重要作用。

qq_38334677的博客 1749

C++排序算法总结(冒泡、插入、选择、希尔、归并、快速、堆)

C++排序算法总结(冒泡、插入、选择、希尔、归并、快速、堆)排序算法是面试中经常遇到以及面试官常考的算法基本功,掌握排序算法对于找工作而言很重要的一个标准。 [转载注明出处] (http://my.youkuaiyun.com/my/mycsdn)排序算法总结: 冒泡排序 插入排序 选择排序 希尔排序 归并排序 快速排序 堆排序 目录C排序算法总结冒泡插入选择希尔归并快速堆目录 冒泡排序 插入排序 选择排序

yuebai008的博客 3725

【知识图谱】neo4j安装与配置_社区版_2025(附完整安装软件包)

(经历过各种版本NEO4J,遇见杂七杂八的各种问题,也看过非常多很好的教程,特此来分享一下,为大家排排坑。

知识靠谱的博客 2万+

C++实现十大排序算法

今天我们来用C++实现一下经典的十大排序算法 具体代码与文件可访问我的GitHub地址获取 https://github.com/liuzuoping/Algorithms PS:欢迎star 1 冒泡排序 冒泡排序无疑是最为出名的排序算法之一,从序列的一端开始往另一端冒泡(你可以从左往右冒泡,也可以从右往左冒泡,看心情),依次比较相邻的两个数的大小(到底是比大还是比小也看你心情)。 (无序区...

liuzuoping的博客 1万+

【ArcGIS Pro微课1000例】0047:深度学习--棕榈树提取全流程

对汤加科洛瓦伊种植园每棵棕榈树的健康状况进行清查和评估,这需要花费大量的时间和劳动力。为简化此过程,将在 ArcGIS Pro 中使用深度学习模型来识别树木,然后根据植被绿度的测量值计算其健康状况。第一步是找到显示汤加科洛瓦伊的影像,该影像具有足够精细的空间和光谱分辨率来识别树木。获得此影像后,将创建训练样本并将其转换为可供深度学习模型使用的格式。为了让模型识别出它的查找任务,需要定义棕榈树的影像,以便识别相似的像素和树木大小。

智慧空间实验室 2207

图解电动汽车:电动汽车的分类

前面《电动汽车简介》中简单介绍了电动汽车的分类,主要包括混合动力电动汽车(HEV)和纯电动汽车(BEV)两大类。其中,混合动力汽车又可分为非插电式混合动力汽车、插电式混合动力汽车(PHEV)以及增程式电动汽车(REEV)。 主要分类 简单来说,各类电动汽车的特点如下。 纯电动汽车(BEV)就是指动力来源完全由电能提供,由电动机驱动的汽车,并且电能储存在电池中。 混合动力汽车(HEV)则是指动力来源可以是化石燃料,也可以是电能,并且电能除了可以存储在电池中,还可以由化石能源转化而来。 非插电式混合动力汽车

程序员「阿基米东」的编程之旅 3089

十种排序算法总结(冒泡、插入、选择、希尔、归并、堆、快速,计数,桶,基数)

首先声明一下,本文只对七种排序算法做简单总结,并参照一些资料给出自己的代码实现,并没有对某种算法理论讲解,更详细的 了解可以参考以下资料(本人参考): 1、《data structure and algorithm analysis in c 》 2、《大话数据结构》 3、http://blog.youkuaiyun.com/morewindows/article/details/7961256

Meditation 7万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C++实现排序算法(简单选择排序、直接插入、冒泡、希尔、快速、堆、折半排序)

算法逻辑可能并不严谨,欢迎各位大佬批评指正!

Kong08242022的博客 1251

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【C++】数据结构 九种排序算法的实现

7000字刨析九种排序算法,步步深入。

就业知识博客 3179

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

六大常见排序算法(插入、堆排、希尔、选择、冒泡、快速)

六大排序算法,有图有真相!!!

欢迎来到梨+萍的博客,不准备看点啥学习嘛。。。 2713

数据结构:排序算法(附c++源码:冒泡、选择、希尔、快速、堆排序)

输入一组关键字序列,分别实现下列排序算法: 1.编写函数,实现简单选择排序、直接插入排序和冒泡排序算法。 2.编写函数,实现希尔排序算法。 3.编写函数,实现快速排序算法。 4.编写函数,实现堆排序算法。 5.编写函数,实现折半插入排序算法。 6.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法。

sherry__yuzu的博客 2033

各种排序算法(冒泡、选择、快排、插入、希尔、堆排、归并、计数、基数)

各种排序算法

wanglelelihuanhuan的专栏 7880

七种排序算法总结(冒泡、插入、选择、希尔、归并、堆、快速)

七种排序算法总结(冒泡、插入、选择、希尔、归并、堆、快速) 首先声明一下,本文只对七种排序算法做简单总结,并参照一些资料给出自己的代码实现,并没有对某种算法理论讲解,更详细的 了 解可以参考以下资料(本人参考): 1、《 data structure and algorithm analysis in c 》 2、《大话数据结构》 3、 http://blog.youkuaiyun.com/...

zhupengqq的博客 280

十大排序算法 (C++实现)

是时候梳理一下传说中的十大排序算法了。

2302_79769914的博客 1652

【数据结构】C++和Python实现几种主要排序算法(插入,选择,冒泡,希尔,快速,归并,计数,基数,桶排序)

之前专业课有上Java,但是当时没想到总结Java的知识点,回头找的时候,电脑中只剩下大堆大堆的Java代码,直到后来参加蓝桥杯的时候也没有进行系统的Java知识点复习,很后悔。所以趁着现在正在学数据结构,就想着把书中的一些经典算法分别用C++和Python重新实现一遍(学校数据结构教课书居然用的是Java写的算法 233333),也算是有个记录。 现在常用的排序算法有插入排序,选择排序,冒泡排序...

qq_41427568的博客 1902

C++十大排序算法

计数排序的时间复杂度为 O(n + k),其中 n 是待排序元素的数量,k 是数据的范围大小。桶排序(Bucket Sort)是一种分布式排序算法,它将待排序的元素分配到若干个桶(Bucket)中,然后对每个桶中的元素进行排序,最后将所有桶中的元素按顺序合并。冒泡排序(Bubble Sort)是一种简单的排序算法,它通过重复地遍历待排序的列表,比较相邻的元素并交换它们的位置来实现排序。选择排序基本思想是每次从待排序的数据中选择最小(或最大)的元素,放到已排序序列的末尾,直到全部数据排序完成。

qq_55527904的博客 1243
上一篇: Linux网络编程(3)——多进程、多线程
Instant_
博客等级 码龄16年 8粉丝 16原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值