转载请注明出处

http://blog.csdn.net/pony_maggie/article/details/35819279

作者:小马

从题目看,首先不是全部是若干。排序算法很多,我个人的能力也有限,不可能都讲到。另外,是简单汇总,是希望能用最简单的代码,最简短的语言说明问题,不搞太多理论分析。

就像前面说的,排序算法有很多,而且不存在哪一种最不好,哪一种最好这样的说法。根据用途不同选择最适合的就行了。不过仅从时间复杂度来看,基本上有两种,一种是O(n^2), 一种是O(nlogn)。

所谓的时间复杂度,其实是基于多少次基本操作定义的,在排序算法中,基本操作指两类,一是比较,二是记录从一个位置移动另一个位置。下面讲到的排序算法都会涉及到这些操作。

一直接插入排序

先从一个最简单的切入。它的思种是这样的,把一个数插入到已排好的序列中。比如已有一个有序序列:

{ 12, 23, 25, 40}

现在有一个数18要插入进来,并且保证插入后序列还是有序。18开始和序列中的所有数逐一比较(从右向左比较),比40小,40后移,比25小,25后移,比23小,23后移,跟12比,发现比12大,停在这里,插入到23的位置,最终变为:

{ 12, 18, 23, 25, 40}

上面的过程叫一趟插入排序,基于这个思想, 我们可以认为数组第一个元素是有序的,所以可以从第二个元素开始,每个元素都做一趟插入排序就可以得到一个有序序列。代码就很简单了,

[cpp] view plaincopy
  1. int insertSort(int nArray[], int nLength)
  2. {
  3. int i = 0;
  4. int j = 0;
  5. int nSerity = 0;//备份要插入的那个元素
  6. for (i = 1; i < nLength; i++)
  7. {
  8. if (nArray[i] < nArray[i-1])
  9. {
  10. nSerity = nArray[i];
  11. nArray[i] = nArray[i-1];
  12. for (j = i-2; (j >= 0)&&(nSerity < nArray[j]); j--)
  13. {
  14. nArray[j+1] = nArray[j];
  15. }
  16. nArray[j+1] = nSerity;
  17. }
  18. }
  19. return 0;
  20. }

很容易看出它的时间复杂度是O(n^2)

二冒泡排序

这个排序算法基本是大学老师必讲的,因为它除了简单之外,也确实比较好玩。思路是这样的,一个无序序列a[n], a[1]和a[2]比较,如果a[1]>a[2], 它们就交换位置,否则不做处理。继续a[2]和a[3]同样的原理比较,一直到a[n-1]和a[n]比较。

上面的过程叫一趟冒泡,请你在脑海里想像下这个过程,我下面要说的这个结论希望你能想明白,那就是经过一趟冒泡后,序列中最大的那个元素已经被换到a[n]的位置了。有没有觉得这个过程就像冒泡一样,只不过这个泡是向下冒的。

做第二趟冒泡时,只要对a[1]~a[n-1]操作就行了,结果是序列中第二大的那个元素在a[n-1]的位置了。然后经过n趟冒泡后,排序就完成了。

通过上面的过程也很容易得出冒泡排序的时间复杂度是O(n^2),可以上代码了,

[cpp] view plaincopy
  1. //bChange作用是为了对于已排好序的序列,能
  2. //及时退出来。
  3. int bubbleSort(int nArray[], int nLength)
  4. {
  5. int i = 0;
  6. int j = 0;
  7. int nTemp = 0;
  8. bool bChange = true;
  9. for (i = 0; (i < nLength) &&(bChange); i++)
  10. {
  11. bChange = false;
  12. for (j = 0; j < (nLength - i - 1); j++)
  13. {
  14. if (nArray[j] > nArray[j+1])
  15. {
  16. nTemp = nArray[j];
  17. nArray[j] = nArray[j+1];
  18. nArray[j+1] = nTemp;
  19. bChange = true;
  20. }
  21. }
  22. }
  23. return 0;
  24. }

可以好好理解一下代码中bChange变量的作用,这里不多说解释了,留给大家思考。

这篇就打算写这么多了,主要篇幅太长怕大家看着厌烦,过几天有空了再接着写吧。

代码下载地址:

http://download.csdn.net/detail/pony_maggie/7568971

https://github.com/pony-maggie/SortDemo

若干排序算法简单汇总(一)相关推荐

  1. 若干排序算法简单汇总(二)

    转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/36706131 作者:小马 一希尔排序 上一篇讲到的直接插入排序,时间复杂度O(n^ ...

  2. 八大排序算法-简单排序(3种)

    八大排序算法-简单排序 javascript-选择排序 jacascript-冒泡排序 jacascript-插入排序 javascript-选择排序 算法思想:简单选择排序是最简单直观的一种算法,基 ...

  3. 排序算法——简单选择排序(PythonJava)

    基本思想 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素( ...

  4. 七大排序算法大汇总(上)

    目录 一.[前言]排序的稳定性: 二.七大排序总览 三.插入排序 1.1直接插入排序 1.2直接插入排序优化版--折半插入排序: 2.希尔排序 四.选择排序 1.1选择排序 1.2进阶版选择排序 2. ...

  5. java 奇偶数据排序算法,简单讲解奇偶排序算法及在Java数组中的实现

    简单讲解奇偶排序算法及在Java数组中的实现 奇偶排序是一个比较有个性的排序,基本思路是奇数列排一趟序,偶数列排一趟序,再奇数排,再偶数排,直到全部有序 举例吧, 待排数组 [6 2 4 1 5 9] ...

  6. 排序算法-简单选择排序

    文章目录 1.基本介绍 2.选择排序的思想 3.选择排序思路分析图 4.代码实现 1.基本介绍 选择排序属于内部排序算法,是从预排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的 ...

  7. java中的排序算法——简单选择排序,树形选择排序与堆排序(一)

    package com.sort; /**  * 选择排序:  * 简单选择排序,树形选择排序与堆排序  *   */ public class SelecSortDemo { /** * ----- ...

  8. 排序算法 | 简单选择排序,算法的图解、实现、复杂度和稳定性分析

    今天讲解一下简单选择排序的原理以及实现.复杂度和稳定性分析 这个内容很简单,轻松加愉快,很快就过了~ 目录 简单选择排序 1 基本思想 2 动态图解 3 代码 4 复杂度分析 简单选择排序 1 基本思 ...

  9. Object-c实现各种排序算法 (汇总)

    /*******************************快速排序 start**********************************/ //随即取 当前取第一个,首先找到第一个的位 ...

  10. 排序算法--排序算法汇总

    排序算法无疑是学习数据结构中的重点内容,本文将给出排序算法的汇总. 下面是具体的实现: #include<stdio.h> #include<stdlib.h> #includ ...

最新文章

  1. 一个中科院退学博士生的感想(zz)
  2. IOS开发基础之屏幕组件适配添加约束
  3. matlab aviobj,MATLAB AVI 视频读取处理
  4. leetcode601. 体育馆的人流量(SQL)
  5. 链表创建为什么需要使用内存分配?
  6. springMVC发送邮件
  7. docker 仓库镜像 替换_自己动手创建 Docker 镜像并分享到镜像仓库,容器引擎的用途越来越广泛!...
  8. php打印预览jquery,JS实现浏览器打印、打印预览示例
  9. ifdef的用法_chisel 高阶用法简介--rocket-chip generator
  10. c语言怎么判别输入字母大小,使用C语言判断英文字符大小写的方法
  11. c语言divide error,Python numpy.corrcoef()RuntimeWarning:在true_divide中遇到无效值c / = stddev [:,None]...
  12. 14.1.2 Checking InnoDB Availability 检查InnoDB 可用性:
  13. TensorFlow:曼德布洛特(Mandelbrot)集合
  14. 本质矩阵 基础矩阵 单应矩阵 (3)
  15. java 查找文件_Java 实例 – 在指定目录中查找文件
  16. web前端程序员两年学习经验与总结
  17. Microchip具有SDI和SQI接口串行SRAM存储器23LC512
  18. 卡刷supersu和magisk实现安卓手机获取root权限
  19. 前端基础总结--CSS
  20. android exo解码问题,android – exoplayer-自动更改质量不起作用(hls)

热门文章

  1. DNS NoteBook
  2. 对照ArcGIS坐标系统文件(.prj)用Deskpro完成投影转换
  3. 数字图像处理(2): 颜色空间/模型—— RGB, CMY/CMYK, HSI, HSV, YUV
  4. PHP 图片上文字排版,文字输出至图片的排版有关问题
  5. python饼状图显示其比例_Python学习笔记(matplotlib篇)--使用matplotlib绘制饼状图
  6. boj 454 帮帮小叮当【SPFA】
  7. 天正计算机命令大全,新手必看-史上最全CAD快捷键大全
  8. 选择中医 - 养肾补肾方法
  9. tewa600agm是千兆吗_请问电信天翼网关光纤猫超级用户 型号tewa-600aem/tewa600agm
  10. C#保存图片、压缩图片大小、缩放图片比例