当前位置:  编程技术>c/c++/嵌入式

基于C++实现的各种内部排序算法汇总

    来源: 互联网  发布时间:2014-10-27

    本文导语:  提起排序算法相信大家都不陌生,或许很多人已经把它们记得滚瓜烂熟,甚至随时可以写出来。是的,这些都是最基本的算法。这里就把各种内部排序算法总结归纳了一下,包括插入排序(直接插入排序,折半插入排序,希尔...

提起排序算法相信大家都不陌生,或许很多人已经把它们记得滚瓜烂熟,甚至随时可以写出来。是的,这些都是最基本的算法。这里就把各种内部排序算法总结归纳了一下,包括插入排序(直接插入排序,折半插入排序,希尔排序)、交换排序(冒泡排序,快速排序)、选择排序(简单选择排序,堆排序)、2-路归并排序。(另:至于堆排序算法,前面已经有一篇文章针对堆排序的算法实现做了详细的描述)

C++实现代码如下:

/*************************************************************************
 > File Name: sort.cpp
 > Author: SongLee
 ************************************************************************/
#include
using namespace std;

typedef int ElementType;

/*
 *
 * 为了实现N个数的排序,将后面N-1个数依次插入到前面已排好的子序列中,
 *假定刚开始第1个数是一个已排好序的子序列。经过N-1趟就能得到一个有序序列。
 *****时间复杂度:最好情况O(n),最坏情况O(n^2),平均情况O(n^2).
 *****空间复杂度:O(1)
 *****稳定性:稳定
 */
void InsertSort(ElementType A[], int n)
{
 int i,j;
 ElementType temp; // 临时变量

 for(i=1; i0 && A[j-1]>temp; --j)
 A[j] = A[j-1];
 A[j] = temp;
 }
}

/*
 *
 * 与直接插入排序不同的是,折半插入排序不是边比较边移动,而是将比较和移
 *动操作分离出来,即先折半查找出元素的待插入位置,然后再统一地移动待插入位
 *置之后的所有元素。不难看出折半插入排序仅仅是减少了比较的次数。
 *****时间复杂度:O(n^2)
 *****空间复杂度:O(1)
 *****稳定性:稳定
 */
void BinaryInsertSort(ElementType A[], int n)
{
 int i, j, low, high, mid;
 ElementType temp;
 for(i=1; i=high+1; --j) // 统一后移
 A[j+1] = A[j];
 A[high+1] = temp; // 插入
 }
}

/*
 *
 * 希尔排序通过比较相距一定间隔的元素,即形如L[i,i+d,i+2d,...i+kd]的序列
 *然后缩小间距,再对各分组序列进行排序。直到只比较相邻元素的最后一趟排序为
 *止,即最后的间距为1。希尔排序有时也叫做*缩小增量排序*
 *****时间复杂度:依赖于增量序列的选择,但最坏情况才为O(N^2)
 *****空间复杂度:O(1)
 *****稳定性:不稳定
 */
void ShellSort(ElementType A[], int n)
{
 int i, j, dk; // dk是增量
 ElementType temp;
 
 for(dk=n/2; dk>0; dk/=2) // 增量变化
 {
 for(i=dk; i=0 && A[j]>temp; j-=dk)
 A[j+dk] = A[j]; // 后移
 A[j+dk] = temp;
 }
 }
}

/*
 *
 * 冒泡排序的基本思想是从后往前(或从前往后)两两比较相邻元素的值,若为
 *逆序,则交换它们,直到序列比较完。我们称它为一趟冒泡。每一趟冒泡都会将一
 *个元素放置到其最终位置上。
 *****时间复杂度:最好情况O(n),最坏情况O(n^2),平均情况O(n^2)
 *****空间复杂度:O(1)
 *****稳定性:稳定
 */
void BubbleSort(ElementType A[], int n)
{
 for(int i=0; ii; --j) // 从后往前
 {
 if(A[j-1] > A[j]) 
 {
 flag = true;
 // 交换
 A[j-1] = A[j-1]^A[j];
 A[j] = A[j-1]^A[j];
 A[j-1] = A[j-1]^A[j];
 }
 }

 if(flag == false)
 return;
 }
}

/*
 *
 * 快速排序是对冒泡排序的一种改进。其基本思想是基于分治法:在待排序表L[n]
 *中任取一个元素pivot作为基准,通过一趟排序将序列划分为两部分L[1...K-1]和
 *L[k+1...n],是的L[1...k-1]中的所有元素都小于pivot,而L[k+1...n]中所有元素
 *都大于或等于pivot。则pivot放在了其最终位置L(k)上。然后,分别递归地对两个子
 *序列重复上述过程,直至每部分内只有一个元素或空为止,即所有元素放在了其最终
 *位置上。
 *****时间复杂度:快排的运行时间与划分是否对称有关,最坏情况O(n^2),最好情况
 *O(nlogn),平均情况为O(nlogn)
 *****空间复杂度:由于需要递归工作栈,最坏情况为O(n),平均情况为O(logn)
 *****稳定性:不稳定
 */
int Partition(ElementType A[], int low, int high)
{
 // 划分操作有很多版本,这里就总以当前表中第一个元素作为枢纽/基准
 ElementType pivot = A[low];
 while(low < high)
 {
 while(low=pivot)
 --high;
 A[low] = A[high]; // 将比枢纽值小的元素移到左端
 while(low

    
 
 

您可能感兴趣的文章:

  • Base64编码原理详解及c++编码解码实现
  • 我实现了个J2EE技术的服务器,支持TCP、UDP和数据库,由于性能的原因,需要改为C或C++实现,我是C、C++新手,我该如何入手呢?看什么样的
  • c++实现MD5算法代码示例
  • java 与 C++ 实现后绑定的方法
  • c++通用模板类(template class)定义实现详细介绍
  • Qt实现的C++框架 qtioccontainer
  • 用C或C++实现主存的分配与回收
  • 在linux系统上,如何用C++实现获取和设置系统时间?
  • 文本压缩算法C++实现 Golden Huffman
  • C++标准库实现 libc++
  • C++的XMLRPC实现 XMLRPC++
  • Java/JavaScript API 的 C++ 实现 libj
  • c++ 连接两个字符串实现代码 实现类似strcat功能
  • c++在unix中如何实现CString的方法?或者说有没有替换CString的类?
  • 请问:java中如何实现C++中的sizeof()方法?
  • 用C或C++编程,模拟可变分区存储管理且首次适应的算法实现存储器的分配与回收
  • vim中如何实现c++代码编写的自动格式化和语法高亮的功能?
  • C++实现CreatThread函数主线程与工作线程交互的方法
  • 请教为什么在C++编译通过并实现的程序,在linux下就会出错
  • linux下c++怎样实现回调(CALLBACK)函数?
  • 在linux下如何用c++实现建立一个文件夹
  • boost unordered_map和std::list相结合的实现LRU算法
  • 那位高人有任务分配问题的禁忌搜索算法、模拟退火算法的算法实现程序啊
  • 使用java jdk中的LinkedHashMap实现简单的LRU算法
  • 【算法】扑克发牌算法实现
  • c语言实现MD5算法完整代码示例
  • C++实现查找中位数的O(N)算法和Kmin算法
  • MD5算法的C语言实现
  • 有没谁对pagerank算法实现有了解?
  • 有没有函数实现压缩算法?
  • 最短路径算法实现 k-shortest-paths
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教如何用b shell/awk实现汇总
  • C#实现快捷键的几种常用方法汇总
  • Oracle实现分页查询的SQL语法汇总
  • sql server实现字符串拆分函数split的方法汇总
  • C语言实现顺序表基本操作汇总
  • Java实现时间动态显示方法汇总
  • VC运用OPENGL加载BMP纹理图的实现方法汇总
  • C++实现各种排序算法类汇总
  • 通过javascript实现DIV居中,兼容各浏览器版本
  • socket实现多文件并发传输,求助多线程实现问题?
  • Python GUI编程:tkinter实现一个窗口并居中代码
  • interface 到底有什么用???实现接口,怎么实现??
  • 通过javascript库JQuery实现页面跳转功能代码
  • 怎么用Jsp实现在页面实现树型结构?
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • windows 下的PortTunnel 在linux下怎么实现?或者相应的已经实现的软件?端口映射
  • php实现socket实现客户端和服务端数据通信源代码
  • 网站重定向用C语言实现iptables,ACL实现
  • flash AS3反射实现(describeType和getDefinitionByName)
  • 在linux下如何编程实现nslookup命令实现的IP地址和域名互相转换的功能?
  • c#通过委托delegate与Dictionary实现action选择器代码举例
  • 求在freebsd+Squid下实现pc上网的透明代理的实现方法!给出具体配置方法的高分谢!
  • iphone cocos2d 精灵的动画效果(图片,纹理,帧)CCAnimation实现
  • linux下如实现与window下的驱动器实现文件共享??
  • c语言判断某一年是否为闰年的各种实现程序代码
  • qt如何实现:操作键盘实现数据的滚动?
  • html<pre>标签自动换行实现方法
  • 我想用APPLET实现读取客户端的图片文件,该如何实现?
  • java tomcat实现Session对象的持久化原理及配置方法介绍
  • PING是用TCP,还是用UDP来实现的?或是采用其它协议实现的?




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3