【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

在上面一篇博客当中,我们发现普通查找和排序查找的性能差别很大。作为一个100万的数据,如果使用普通的查找方法,那么每一个数据查找平均下来就要几十万次,那么二分法的查找呢,20多次就可以搞定。这中间的差别是非常明显的。既然排序有这么好的效果,那么这篇博客中,我们就对排序算做一个总结。

按照我个人的理解,排序可以分为两种:一种是非递归排序,它主要按照非递归的方法对数据进行排序,也就是说主要数据的移位和循环来完成;另外一种就是递归方法,我们在排列当前数据的时候首先把子数据排列有序,然后才会排列当前的数据。这种不断递归调用的方法就是递归排序。

非递归排序的方法很多,这里主要介绍冒泡排序、插入排序、希尔排序;递归的方法也不少,这里介绍的方法是快速排序、归并排序和堆排序。排序的内容很多,本篇博客主要介绍非递归排序,递归排序的内容主要在下一节内容解决。

(1)冒泡排序

冒泡排序的内容并不复杂。假设有n个数据需要排序,那么我们需要确定n个从大到小的数据,每一次都挑选第n大的数据是多少,并且放大相应的位置。直到所有的数据都排列整齐了,那么我们的排序就结束了。

void bubble_sort(int array[], int length)
{
int inner = 0, outer = 0;
int median = 0;
if(NULL == array || 0 == length)
return;
for(outer = length-1; outer >= 1; outer --){
for(inner = 0; inner < outer; inner ++){
if(array[inner] > array[inner + 1]){
median = array[inner];
array[inner] = array[inner + 1];
array[inner + 1] = median;
}
}
}
}

那么这个程序有没有什么改进的地方呢?当然存在,如果发现在一次遍历循环之中,如果没有发生移位的现象,那么是不是可以判断这个排序可以结束了呢?朋友们可以好好思考一下这个问题?

void bubble_sort(int array[], int length)
{
int inner = 0, outer = 0;
int median = 0;
int flag = 1;
if(NULL == array || 0 == length)
return;
for(outer = length-1; outer >= 1 && flag; outer --){
flag = 0;
for(inner = 0; inner < outer; inner ++){
if(array[inner] > array[inner + 1]){
median = array[inner];
array[inner] = array[inner + 1];
array[inner + 1] = median;
if(flag == 0)
flag = 1;
}
}
}
}

(2) 插入排序

插入排序的意思就是说,我们把数据分成两个部分,一部分是已经排好序的数据,一部分是当前还没有完成排序的数据。那么这么说来的话,排序的过程是不是就是把没有排序的数据逐个插入到已经排好序的队列中的过程呢。大家可以自己先试一下,然后再看看我的代码对不对?

void insert_sort(int array[], int length)
{
int inner = 0;
int outer = 0;
int median = 0;
if(NULL == array || 0 == length)
return;
for(outer = 1; outer <length; outer ++){
for(inner = outer; inner >= 1; inner --){
if(array[inner] < array[inner -1]){
median = array[inner];
array[inner] = array[inner -1];
array[inner -1] = median;
}else{
break;
}
}
}
}

那么插入排序有没有像冒泡排序那样的改进方法呢?其实没有。因为每一次插入排序的位置都是局部比较的结果,而冒泡排序每一次的内容都是全局最优的。这从数据比较的次数就可以看出来。

(3)希尔排序

希尔排序,我个人认为可以看成是冒泡排序的变种。它的基本思想是:首先按照一个序列递减的方法逐渐进行排序。比如说有10个数据,我们按照序列5、3、1的顺序进行排序。首先是5,那么我们对1和6、2和7、3和8、4和9、5和10进行排列;第二轮是3,那么对数据1、4、7、10排列,再对2、5、8进行排列,以及3、6、9排列;第三轮就和冒泡排序一样了,以此对每个数据进行排列。它的优势就是让整个队列基本有序,减少数据移动的次数,从而降低算法的计算复杂度。

void shell_sort(int array[], int length, int step)
{
int inner = 0;
int outer = 0;
int median = 0;
if(NULL == array || 0 == length)
return;
for(; step >= 1; step -=2){
for(int index = 0; index < step; index ++){
if((length -1) < (index + step))
continue;
else{
outer = index + step;
while( (outer + step) <= (length - 1))
outer += step;
}
for(;  outer >= (index + step);  outer -= step){
for(inner = index; inner <= outer - step; inner += step){
if(array[inner] >= array[inner + step]){
median = array[inner];
array[inner] = array[inner + step];
array[inner + step] = median;
}
}
}
}
}
}

总结:

(1)上面的排序都是非递归程序,理解上不难,但是细节问题需要注意,特别是长度的问题

(2)代码编写的时候务必注意测试用例的设计

(3)如果可能的情况下,多使用已经验证的代码和函数

【预告: 下一篇博客介绍快速排序的内容】

一步一步写算法(之非递归排序)相关推荐

  1. php递归算法排序,php常用的排序算法代码[冒泡,递归排序-PHP源码

    <script>ec(2);<script> php 常用的排序算法代码[冒泡,递归排序 冒泡排序算法 function bubblesort($arr) { $n=count ...

  2. 一步一步写算法(之合并排序)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面一篇博客提到的快速排序是排序算法中的一种经典算法.和快速排序一样,合并排序是另外一种经常使 ...

  3. 二叉树几种遍历算法的非递归实现

    二叉树遍历的非递归实现 相对于递归遍历二叉树,非递归遍历显得复杂了许多,但换来的好处是算法的时间效率有了提高.下面对于我学习非递归遍历二叉树算法的过程进行总结 为了便于理解,这里以下图的二叉树为例,分 ...

  4. python实现冒泡排序算法的非递归版本_冒泡排序以及python代码实现(递归+非递归)...

    一.冒泡排序 比较简单的排序算法,适合小规模数据集,效率较低. 依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面. 每进行一趟排序,就会少比较一个数 python代码(非递归): fro ...

  5. 二叉树插入算法的非递归版本

    首先约定结点和元素类型的的定义: typedef int ElementType; typedef struct TNode *Position; typedef Position BinTree; ...

  6. 组合数算法的非递归实现

    问题描述 前段时间有位新员工同事遇到了对象组合问题,使用递归的方式实现,在代码审阅的过程中发现,该方法在实现上存在业务逻辑与算法逻辑耦合度过高.使用不便于调试的非尾递归等问题,而数组元素组合在我们开发 ...

  7. 字典序全排列算法(非递归全排列算法)

    非递归全排列算法: 我们先看一个例子. 示例: 1 2 3的全排列如下: 1 2 3 , 1 3 2 , 2 1 3 , 2 3 1 , 3 1 2 , 3 2 1 我们这里是通过字典序法找出来的. ...

  8. 数据结构——二叉树的递归遍历算法与非递归遍历算法+层次遍历算法

    (文章篇幅有点长,二叉树的递归遍历算法不作详细分析,但是二叉树的非递归遍历算法和层次遍历算法都有非常详细的分析过程,记得往下翻哦!) 二叉树的递归遍历算法实现 我们首先用递归的方法先序遍历创建这样一棵 ...

  9. 多目标优化算法:非支配排序的鲸鱼优化算法(Non-Dominated Sorting Whale Optimization Algorithm,NSWOA)提供Matlab代码

    一.非支配排序的鲸鱼优化算法 非支配排序的鲸鱼优化算法(Non-Dominated Sorting Whale Optimization Algorithm,NSWOA)由Pradeep Jangir ...

最新文章

  1. scala言语基础学习八
  2. java jvm 参数 -Xms -Xmx -Xmn -Xss 调优总结
  3. [IDEA 配置MYSQL数据库连接]
  4. mac笔记本怎么外接显示屏_苹果MAC笔记本怎么外接显示器?
  5. Angular 项目 ng serve 背后发生的事情
  6. 8080:The Tomcat connector configured to listen on port 8080 failed to start 的解决办法
  7. Laravel 怎么查看执行的Sql语句
  8. numpy 线性代数
  9. java版 二叉树 所有递归和非递归遍历算法
  10. android非法字符的判定、表情符号的判定
  11. Ubuntu16.04安装VSCode
  12. C# HttpWebRequest 绝技 【转】
  13. Java设计模式——模板方法模式(模板方法设计模式)详解
  14. CPDA数据分析师:一个完整的数据分析流程
  15. 解决jqueryUI img tilte样式不显示问题
  16. 调和级数相关极限合集
  17. 国耀明医院互联网医院:儿童医保门诊不报销???你错啦!
  18. phython学习资料
  19. X11 - X client数量达到上限并报错Maximum number of clients reachedxlsclients
  20. 当机械人也开始拥有感情‧谁来定义什么才是人类?

热门文章

  1. M283-bsp包问题
  2. 启动tomcat后无法访问
  3. php 返回json对象
  4. Android github上的好的开源项目汇总
  5. 《数学之美》读书笔记和知识点总结(一)
  6. C#实现AES加密和解密
  7. IT技术人终究要走上管理职位吗?
  8. Python使用Plotly绘图工具,绘制面积图
  9. fastdfs-client-java操作fastdfs
  10. 实验十一 连接数据库实验(V2.0)