【C++语言实现通用插入排序算法】

简介:

插入排序算法的C++通用版本,支持任何以迭代器(或普通数组首、尾指针)传入的数组的就地排序。

myutil.h

 

代码:
#pragma once
#ifndef _MY_UTIL_H
#define _MY_UTIL_H

#include<iterator>  //iterator_traits

//template function to display arrays with new line printed when finish.
template<class Iterator>
void displayArr(const Iterator &beg, const Iterator &end){
  typedef typename std::iterator_traits<Iterator>::value_type Ty;
  std::copy(beg, end, std::ostream_iterator<Ty>(std::cout, " "));
  std::cout<<std::endl;
}

#endif

 

insertion_sort.h

 

代码:

#pragma once
#ifndef _INSERT_SORT_H
#define _INSERT_SORT_H

#include<iterator>  //iterator_traits

template<class Iterator, class cmp>
void insertSort(const Iterator &beg, const Iterator &end){
  typedef typename std::iterator_traits<Iterator>::value_type val_t;
  Iterator step = beg;
  Iterator insertPos;
  Iterator beforeInsertPos;
  for(++step; step != end; ++step){
    val_t key = *step;
    insertPos = step;
    beforeInsertPos = insertPos;
    for(--beforeInsertPos; cmp()(*beforeInsertPos, key); --beforeInsertPos){
      *insertPos-- = *beforeInsertPos;
      if(beforeInsertPos == beg)
        break;
    }//end of for
    *insertPos = key;
  }// end of for
}// end of insertion sort

#endif

main.cpp

 

代码:
#include<iostream>
#include<string>
#include<vector>
#include<list>

#include"myutil.h"  //displayArr
#include"insertion_sort.h"  //insertSort

using std::cout;
using std::endl;
using std::vector;
using std::string;
using std::list;

int main(int argc, char **argv)
{
  int intArr[ ] = { 231, -547, -54, 54, 0, -1, 45, -54, 123, 9, -54 };
  int *intArrEnd = intArr + sizeof(intArr) / sizeof(*intArr);

  double doubleArr[ ] = { 0.0, -28.7, 465.2 };
  double *doubleArrEnd = doubleArr + sizeof(doubleArr) / sizeof(*doubleArr);

  string strArr[] = {"月夜幻影", "bill", "billhoo", "Alex", "alex", "Petter"};
  string *strArrEnd = strArr + sizeof(strArr) / sizeof(*strArr);

  vector<string> strVec(strArr, strArrEnd);
  list<string> strList(strArr, strArrEnd);

  cout<<"before insertion sort..."<<endl;
  displayArr<int*>(intArr, intArrEnd);
  displayArr<double*>(doubleArr, doubleArrEnd);
  displayArr<string*>(strArr, strArrEnd);
  displayArr(strVec.begin(), strVec.end());
  displayArr(strList.begin(), strList.end());

  //do insertion sort in ascending order
  insertSort<int*, std::greater<int>>(intArr, intArrEnd);
  insertSort<double*, std::greater<double>>(doubleArr, doubleArrEnd);
  insertSort<string*, std::greater<string>>(strArr, strArrEnd);
  insertSort<vector<string>::iterator, std::greater<string>>(strVec.begin(), strVec.end());
  insertSort<list<string>::iterator, std::greater<string>>(strList.begin(), strList.end());

  cout<<"\nascending order:"<<endl;
  displayArr<int*>(intArr, intArrEnd);
  displayArr<double*>(doubleArr, doubleArrEnd);
  displayArr<string*>(strArr, strArrEnd);
  displayArr(strVec.begin(), strVec.end());
  displayArr(strList.begin(), strList.end());

  //do insertion sort in descending order
  insertSort<int*, std::less<int>>(intArr, intArrEnd);
  insertSort<double*, std::less<double>>(doubleArr, doubleArrEnd);
  insertSort<string*, std::less<string>>(strArr, strArrEnd);
  insertSort<vector<string>::iterator, std::less<string>>(strVec.begin(), strVec.end());
  insertSort<list<string>::iterator, std::less<string>>(strList.begin(), strList.end());

  cout<<"\ndescending order:"<<endl;
  displayArr<int*>(intArr, intArrEnd);
  displayArr<double*>(doubleArr, doubleArrEnd);
  displayArr<string*>(strArr, strArrEnd);
  displayArr(strVec.begin(), strVec.end());
  displayArr(strList.begin(), strList.end());

  return EXIT_SUCCESS;
}

 

 



     本文转自Bill_Hoo 51CTO博客,原文链接:http://blog.51cto.com/billhoo/793581,如需转载请自行联系原作者








相关文章
|
24天前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
72 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
3月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
112 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
5天前
|
负载均衡 算法 安全
探秘:基于 C++ 的局域网电脑控制软件自适应指令分发算法
在现代企业信息化架构中,局域网电脑控制软件如同“指挥官”,通过自适应指令分发算法动态调整指令发送节奏与数据量,确保不同性能的终端设备高效运行。基于C++语言,利用套接字实现稳定连接和线程同步管理,结合实时状态反馈,优化指令分发策略,提升整体管控效率,保障网络稳定,助力数字化办公。
40 19
|
10天前
|
存储 监控 算法
探秘局域网桌面监控:深入剖析 Java 语言核心算法
在数字化办公时代,局域网桌面监控如同企业的“智慧鹰眼”,确保工作效率与数据安全。本文以Java为载体,揭示哈希表在监控中的关键应用。通过高效的数据结构和算法,哈希表能快速索引设备连接信息,大幅提升监控的时效性和响应速度。代码示例展示了如何用Java实现设备网络连接监控,结合未来技术如AI、大数据,展望更智能的监控体系,助力企业在数字化浪潮中稳健前行。
|
10天前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
33 2
|
19天前
|
算法 安全 Go
Go 语言中实现 RSA 加解密、签名验证算法
随着互联网的发展,安全需求日益增长。非对称加密算法RSA成为密码学中的重要代表。本文介绍如何使用Go语言和[forgoer/openssl](https://github.com/forgoer/openssl)库简化RSA加解密操作,包括秘钥生成、加解密及签名验证。该库还支持AES、DES等常用算法,安装简便,代码示例清晰易懂。
52 12
|
18天前
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
16天前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
23天前
|
算法 安全 C++
用 C++ 算法控制员工上网的软件,关键逻辑是啥?来深度解读下
在企业信息化管理中,控制员工上网的软件成为保障网络秩序与提升办公效率的关键工具。该软件基于C++语言,融合红黑树、令牌桶和滑动窗口等算法,实现网址精准过滤、流量均衡分配及异常连接监测。通过高效的数据结构与算法设计,确保企业网络资源优化配置与安全防护升级,同时尊重员工权益,助力企业数字化发展。
42 4
|
22天前
|
监控 算法 安全
解锁企业计算机监控的关键:基于 Go 语言的精准洞察算法
企业计算机监控在数字化浪潮下至关重要,旨在保障信息资产安全与高效运营。利用Go语言的并发编程和系统交互能力,通过进程监控、网络行为分析及应用程序使用记录等手段,实时掌握计算机运行状态。具体实现包括获取进程信息、解析网络数据包、记录应用使用时长等,确保企业信息安全合规,提升工作效率。本文转载自:[VIPShare](https://www.vipshare.com)。
27 0