#ifndef SORT_ALGORITHM_H_
#define SORT_ALGORITHM_H_
#include <assert.h>
#include <iostream>
using std::cout;
using std::endl;
template<class T,int len>
//T为排序序列元素类型,len为序列元素数目
class CSort
{
public:
CSort(const T* arr);
virtual~ CSort();
//直接插入排序算法
void InsertSort()const;
//折半插入排序算法
void BinaryInsertSort()const;
//希尔排序算法
void ShellSort(int dk[],const int& count)const;
//冒泡排序算法
void BubbleSort()const;
//快速排序算法
void QuickSort()const;
//打印出数据
void Show()const;
//元素逆序输出
void Scroll()const;
//交换两个元素的值
inline void Swap(T& t1,T& t2)const;
protected:
//一趟希尔排序
void ShellInsert(const int& dk)const;
int Partition(int low,int high)const;
void QSort(int low,int high)const;
private:
T* buffer;//指向首地址,在整个过程中都不会改变之
int m_length;//元素数目
};
template<class T,int len>
CSort<T,len>::CSort(const T *arr):buffer(NULL),m_length(len)
{
assert(arr&&len>0);
buffer=const_cast<T*>(arr);
}
template<class T,int len>
CSort<T,len>::~CSort()
{
}
/*******************************************************************************************/
//直接插入排序
template<class T,int len>
void CSort<T,len>::InsertSort()const
{//arr 数组或指针首地址,len数组或指针中元素数目
cout<<"开始进行直接插入排序----------------------------------------"<<endl;
T* p=buffer;
int i=1,j=0;
for(;i<len;++i)
{
if(*(p+i)<*(p+i-1))
{
T temp=*(p+i);//暂存
for(j=i-1;j>=0&&temp<*(p+j);--j)//循环知道找到插入位置
*(p+j+1)=*(p+j);
*(p+j+1)=temp;
}
}
}//时间复杂度为O(n^2)
/**********************************************************************************************/
//折半插入排序算法
template<class T,int len>
void CSort<T,len>::BinaryInsertSort()const
{
cout<<"开始折半插入排序--------------------------------------------"<<endl;
T* p=buffer;
int i=0,j=0;
for(i=1;i<len;++i)
{
T temp=*(p+i);
int low=0,high=i-1;
while(low<=high)
{
int mid=(low+high)/2;
if(temp<*(p+mid))
high=mid-1;
else
low=mid+1;
}
for(j=i-1;j>=high+1;--j)
*(p+j+1)=*(p+j);
*(p+high+1)=temp;
}
}
/*********************************************************************************************************/
//希尔排序,对直接插入排序算法的一种改进
template<class T,int len>
void CSort<T,len>::ShellInsert(const int& dk)const
{//dk 希尔排序增量
assert(dk>0);
int i=0,j=0;
T* p=buffer;
for(i=dk;i<m_length;++i)
{
if(*(p+i)<*(p+i-dk))
{
T temp=*(p+i);
for(j=i-dk;j>0&&temp<*(p+j);j-=dk)
*(p+j+dk)=*(p+j);
*(p+j+dk)=temp;
}
}
}
/*(增量数组的最后一个元素值必须为1,因为最后一次是进行一次直接插入排序)
给出几个常用增量数组:
dk[k]=2^(t-k+1)-1时(t为排序趟数),时间复杂度为:O(n^1.5)
dk[k]=2^(t-k)+1
dk[k]=0.5(3^(t-k)-1)
希尔排序的时间复杂度没有确定值,增量序列有多种取法*/
template<class T,int len>
void CSort<T,len>::ShellSort(int dk[],const int& count)const
{//dk[]为增量数组,count为增量数组的元素数目
cout<<"开始进行希尔排序------------------------------------------"<<endl;
for(int i=0;i<count;++i)
ShellInsert(dk[i]);
}//时间复杂度为O(n^1.5)
/*************************************************************************************************/
//冒泡排序
template<class T,int len>
void CSort<T,len>::BubbleSort()const
{
cout<<"开始进行冒泡排序------------------------------------------"<<endl;
T* p=buffer;
int i=0,j=0;
for(;i<len;++i)
{
for(j=len-1;j>i;--j)
{
if(*(p+j)<*(p+j-1))
{
Swap(*(p+j),*(p+j-1));
/*T temp=*(p+j);
*(p+j)=*(p+j-1);
*(p+j-1)=temp;*/
}
}
}
}
/****************************************************************************************************/
//快速排序
template<class T,int len>
int CSort<T,len>::Partition(int low,int high)const//一趟快速排序
{
T* p=buffer;
T prikey=*(p+low);
while(low<high)
{
while(low<high&&*(p+high)>=prikey)
--high;
*(p+low)=*(p+high);
while(low<high&&*(p+low)<=prikey)
++low;
*(p+high)=*(p+low);
}
*(p+low)=prikey;
return low;
}
template<class T,int len>
void CSort<T,len>::QSort(int low,int high)const
{
if(low<high)
{
int ret=Partition(low,high);
QSort(low,ret-1);
QSort(ret+1,high);
}
}
template<class T,int len>
void CSort<T,len>::QuickSort()const
{
cout<<"开始快速排序--------------------------------------------------"<<endl;
QSort(0,m_length-1);
}
/**************************************************************************************************/
template<class T,int len>
void CSort<T,len>::Show()const// 显示数组中的元素
{
cout<<"打印元素序列:"<<endl;
T* p=buffer;
for(int i=0;i<m_length;++i)
cout<<*(p+i)<<" ";
cout<<endl;
}
template<class T,int len>
void CSort<T,len>::Scroll() const
{
T* p=buffer;
int low=0,high=m_length-1;
while(low<high)
{
Swap(*(p+low),*(p+high));
low++;
high--;
}
}
template<class T,int len>
inline void CSort<T,len>::Swap(T &t1, T &t2) const
{
T temp=t1;
t1=t2;
t2=temp;
}
#endif;突然发现学生时代保留下来的一段代码,基本算法的C++模板实现,收藏下。
相关推荐
【gateway nc adapter虚拟网卡 win11 联想】问题的解决
由于需要登录公司内网,于是启用奇安信VPN。但启动后报出网关未连接的问题,于是我检查了我的网络适配器,并尝试解决,以下给出几种我实践过程中的行动,并附带最后成功的解决方法。
【数据结构实验】上机实验11:几种典型排序算法的实现编程实现:分别利用直接插入/折半插入/希尔/冒泡/快速/简单选择排序算法
编程实现:分别利用直接插入/折半插入/希尔/冒泡/快速/简单选择排序算法实现将待排序序列{3,6,2,10,1,20,88,8,5,7,4,9}由小到大排序,并输出结果。
智能车‘大脑’的诞生:揭秘电磁循迹代码背后的控制论与系统思维
本文深入探讨智能车电磁循迹系统的核心架构与控制原理,揭示了其作为精密闭环系统如何通过模块化设计、信号处理、PID控制算法及电机驱动实现自主导航。重点分析了电磁信号采集与处理流程框架,为开发者提供从理论到实践的全面指南。
C语言实现各个排序算法(直接插入排序,折半插入排序,希尔排序,冒泡排序,简单选择排序)
数据结构开发总结报告 ——内部排序综合设计程序的编程实现 实现各个排序算法(直接插入排序,折半插入排序,希尔排序,冒泡排序,简单选择排序) #include<stdio.h> #define MaxSize 20 #include<windows.h> typedef int KeyType; //定义关键字类型 typedef struct //记录类型 { KeyType key; //关键字项 } RecType;
量子磁场测量技术在生物磁场成像领域的应用现状与产业趋势
首先对量子磁场测量技术的发展进行了简述,然后介绍了量子磁场测量技术在生物磁场成像领域的应用,最后分析了量子磁场测量技术的两大重要应用方向(心磁图仪和脑磁图仪)及其产业现状和未来发展趋势。美国普林斯顿大学在《自然》上公布了目前人类磁场测量灵敏度最高的基于量子磁场测量技术的零场原子磁力计。拥有巨大的发展潜力及庞大的市场空间。因此其数千万元的高昂售价及每年数百万元的超导维护成本限制了超导式心磁图仪的发展和临床应用。而基于超导式脑磁图仪的癫痫、阿尔兹海默症、抑郁症等脑疾病患者的临床研究也取得丰富的研究成果。
VC中基于TWAIN协议控制扫描仪-----初级版
PS:本人是C++小白一枚,在研究此功能时不知走了多少弯路
数据结构排序算法之直接插入、折半插入、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序(二路归并排序)C语言实现
插入:直接插入、折半插入、希尔排序 交换:冒泡排序、快速排序⭐ 选择:简单选择排序、堆排序⭐ 归并:归并排序(二路归并排序)⭐ 快速排序、堆排序和归并排序为时间复杂度较小的排序方法,为O(nlogn); 英语不太好,有些算法就直接用拼音了... 这些算法的输入输出语句用的是cout.cin。(为C++内容,只需将头文件改为#include<iostream> using namespace std;即可兼容C\C++语句。或可直接将cin.cout语句改为scanf\printf语.
想重装OpenClaw?先执行这4步彻底卸载,避免配置冲突
在重装OpenClaw之前,彻底卸载是非常重要的一步。如果不彻底卸载,可能会导致: - 残留的配置文件与新安装的版本冲突 - 旧的依赖包干扰新的安装过程 - 服务冲突导致启动失败 - 数据混乱影响系统稳定性
对于给定的序列实现直接插入、折半插入、冒泡、希尔、快速、选择、堆排序
1.本代码一共实现7种常见排序,其中直接插入排序和折半插入排序思想相同,只不过在寻找插入位置的时候,折半插入排序采用了二分法,在这一步上较直接插入排序更快。 2.冒泡排序很简单,但是可以进阶一步,在内层循环 j 中加一个flag标识,判断在这一次循环中有没有发生值交换。如果发生了,那么flag的值变化。如果没发生,就直接break循环,节省时间提高效率。 3.希尔排序属于高级排序方法,采用的是缩小增量的思想。在开始正式的排序之前(这个正式的排序可以理解为直接插入排序),先对序列中的一小部分进行排序,这个
分子动力学仿真软件:LAMMPS_(16).应用案例分析
通过以上四个应用案例,我们详细介绍了如何使用LAMMPS进行不同系统的分子动力学仿真。从简单的液体水仿真到复杂的纳米管仿真,每个案例都包含了详细的步骤说明和代码示例。读者可以通过这些示例实际操作并验证结果,从而更好地理解LAMMPS的功能和使用方法。希望这些案例能够为读者在分子动力学仿真领域的研究和应用提供帮助。
Dify 第 19 篇 手把手教你开发 Dify 插件:从零实现一个时间工具
本文介绍了Dify平台的插件开发机制和流程。Dify支持多种插件类型,包括模型、工具、数据源等,可通过CLI工具快速开发插件。文章详细讲解了如何安装Dify CLI工具,并演示了从零开发一个获取系统时间插件的完整过程,包括项目初始化、文件解读和打包部署。通过该教程,开发者可以快速掌握Dify插件开发的核心要点,实现自定义功能扩展。
数据结构八:各类内部排序算法
包含有多个内部排序算法代码实现:直接插入排序、折半插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、二路归并排序。
效果炸裂_安装midscene_copw基于midscene操作电脑_基于视觉的软件测试执行_MIDSCENE的安装和使用---AI大模型应用探索0012
摘要:本文介绍了如何通过安装MidSceneJS来增强Copaw的屏幕操作能力。首先需要安装Node.js和npm,并配置淘宝镜像源加速安装。然后全局安装MidScene CLI工具(npm install @midscene/cli -g)。接着配置视觉大模型服务,通过设置环境变量指定模型API密钥、名称、基础URL和家族类型(如qwen3.5-27b),配置文件需存放在C:\Users\Administrator.copaw目录。安装成功后,MidScene已能成功识别并操作屏幕,使用效果良好。文中还提
排序笔记(1)插入排序(直接插入+折半插入+希尔排序)、交换排序(冒泡+快排)
文章目录排序分类(1)插入排序1.直接插入2.折半插入3.希尔排序(2)选择排序1.简单选择排序2.堆排序(3)归并排序(4)分配排序 排序分类 (1)插入排序 视第一个数为已经排好序的数,将接下来的数插进前面已经排好序的数中,直至全部插完。 1.直接插入 例:将数组[1 5 3 2]按照从小到大的顺序排序。 【】内为已经排好序的数 第一步:【1】5 3 2 (视第一个数为排好序的数) 第二步:【1 5】3 2(5>1,将5插到1的后面) 第三步:【1 3 5】2(3>1,3<5,找到3
VC中sqlite的使用
在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示
OV9734 DATASHEET,完整规格书
OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等
C++数据结构实验四:排序
C++数据结构实验:排序。实现简单选择排序、直接插入排序和冒泡排序算法;实现希尔排序算法;实现快速排序算法;实现堆排序算法;实现折半插入排序算法。
计算机控制技术及应用
《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。
C++实现内部排序算法(包含直接插入排序,折半插入排序,希尔排序,冒泡排序,快速排序,选择排序,堆排序,归并排序,基数排序)
1.直接插入排序。其中len的值为待排序数的长度+1,数组第一个空间用作辅助。基本思想:直接插入排序其基本操作就是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。这里就是将待排序的数插入已排序好的序列中从而实现排序。 void Sort::InsertSort() { int i, j; for (i = 2; i<this->len; i++) { ...
win10 跳过U8环境检测的IE WebControls.rar
win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。
数据结构:排序算法(附c++源码:冒泡、选择、希尔、快速、堆排序)
输入一组关键字序列,分别实现下列排序算法: 1.编写函数,实现简单选择排序、直接插入排序和冒泡排序算法。 2.编写函数,实现希尔排序算法。 3.编写函数,实现快速排序算法。 4.编写函数,实现堆排序算法。 5.编写函数,实现折半插入排序算法。 6.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法。
大学数据结构实验(七.内部排序算法的应用一)
大学程序实验.数据结构.内部排序算法的应用一.排序0 目录7 内部排序算法的应用7.1 排序7.1.1 题目7.1.2 源码 0 目录 7 内部排序算法的应用 7.1 排序 7.1.1 题目 1、常见排序算法实现(1-6选择几个算法练习) 1)问题描述:输入一组关键字序列分别实现下列排序。 (1)实现简单选择排序、直接插入排序和冒泡排序。 (2)实现希尔排序算法。 (3)实现折半插入排序...
8种内部排序算法比较 (C++)
各种内部排序算法比较 C++ 内容 对大量整数或单词排序,分别用内部排序算法-插入排序(1.直接插入排序、2.折半插入排序、3.希尔排序)、交换排序(4.冒泡、5.快速排序)、选择排序(6.直接选择排序、7.堆排序)和归并排序(8.2-路归并排序)具体实现 ,并可计算排序时间,验证时间复杂度。 源代码 #include<stdio.h> #include<stdlib.h> #include<math.h> #include<time.h> #undef OV
直接/折半插入排序 希尔排序 冒泡排序 快速排序 简单选择排序 堆排序 归并排序 C++实现
直接插入排序 #include<stdio.h> #include<iostream> using namespace std; //直接插入排序(非递减) void InsertSort(int A[],int n){ int i,j,temp; for(i=1;i<n;i++){//从数组第二个元素开始比较 if(A[i]<A[i-1]){ temp=A[i]; for(j=i-1;j&
数据结构实验报告(四)——查找和排序算法
数据结构实验报告——查找和排序
C/C++ 排序算法 及 时间复杂度和空间复杂度 (直接插入排序,折半插入排序,希尔排序,简单选择排序,堆排序,冒泡排序,快速排序,归并排序,基数排序)
一,直接插入排序 二,折半插入排序 三,希尔排序 四,简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 #include&amp;amp;lt;stdio.h&amp;amp;gt; #include&amp;amp;lt;stdlib.h&amp;amp;gt; #include&amp;amp;lt;string.h&amp;amp;gt; //输出模块 void O
ios 常用的排序算法
//常用的排序算法 #include using namespace std; typedef int ElemType; /* 1、插入排序 (1)直接插入排序算法 算法思想:将等排序列划分为有序与无序两部分,然后再依次将无序部分插入到已经有序的部分,最后 就可以形成有序序列。 操作步骤如下: 1)查找出元素L(i)在表中的
常见排序算法(c++)
插入排序,折半插入排序,希尔排序,冒泡排序,选择排序,快速排序,归并排序的c++实现
各种排序代码总结(待续)
未完待续啊~ 1、直接插入排序 void Sort::InsertSort(){ for(int i=2;i<=length;i++){ int j; sstable[0]=sstable[i]; for(j=i-1;sstable[0].key<sstable[j].key;j--){ ...
6549



被折叠的 条评论
为什么被折叠?



