(冒泡,选择,插入,希尔,快速,归并,堆排)
周末加班学习C++,打算用C++写七大经典排序代码。
发现3个月前自己写的七大经典排序代码(C Language)突然运行出错。

Makefile内容

testmysort: testmysort.c mysortlib.c mysortlib.h
# gcc testmysort.c mysortlib.c -o testmysort
gcc $< mysortlib.c -o $@
./$@

直接make几次总是core dumped错误。

这时我用git已有快一年经验,当时就后悔没用git来跟踪代码变化。如果用git,只要git diff 就可以快速定位导致影响的代码。
git真的是一个好工具,一次又一次发现。
我想以后我的代码都要这样管理。

没办法,自己debug,看代码,多谢前面自己做到工作,本来就输出了很多有用的消息,竟然没动用gdb。
1、定位问题,#define sortfunc _msort可知与归并排序函数有关,换成_qsort测试没问题,因此肯定_msort()有问题。
2、排除问题:问题在一个地方,合并时的条件判断出错了!debug过程在源码中有记录,改5次后成功。

void _msort(int arr[], int len)
{/* 2014-03-26 一次写好就对!!???==>>那是错觉@2014-08-10@*/
if (len<10){
_isort(arr, len);
return;
}
/* sorting each half part */
int m = len/2;
_msort(arr, m);
_msort(arr+m, len-m); /* merge, use memery outside */
int *arrtmp = (int*)malloc(len*sizeof(int));
int i=0,j=m,k=0; /* i是前游标,j是后游标,k申请内存的游标*/
for (k=0;k<len;k++){
/* bug v1 发现排序结果是规则的波峰型
* 偶尔运行时core dumped
if (arr[i]<arr[j]){
arrtmp[k] = arr[i++];
}else{
arrtmp[k] = arr[j++];
}
*/
/* bug v2 不全面(i<m && arr[i]>=arr[j] 条件下:如果j>=m,也该执行分支一)
* 偶尔运行时core dumped
if (i<m && arr[i]<arr[j]){
arrtmp[k] = arr[i++];
}else{
arrtmp[k] = arr[j++];
}
*/
/* bug v3 已接近正确,仅错在j>=m,一开始没发现
if (j>=m || i<m && arr[i]<arr[j]){
arrtmp[k] = arr[i++];
}else{
arrtmp[k] = arr[j++];
}
*/
/* bug v4 括号没改变逻辑
if (j>=m || (i<m && arr[i]<arr[j])){
arrtmp[k] = arr[i++];
}else{
arrtmp[k] = arr[j++];
}
*/
/* 总结:
* 一、if中的两分支具有*互换性*,所以地位相等,推出走每个分支的期望必须都是1/2。
* 二、概率公式:P(A或B) = P(A) + P(B) - P(A且B)
* 三、考虑到隐藏的附加条件:j>=len与i>=m不可同时成立,推出j>=len时必i<m,同理i>=m时必j<len
*/
if (j>=len || (i<m && arr[i]<arr[j])){
arrtmp[k] = arr[i++]; /* 走此路概率:1/2+1/2*1/2-1/2*1/2 = 1/2 */
}else{ /* 等价:if (i>=m || (j<len && arr[i]>= arr[j])) */
arrtmp[k] = arr[j++];
}
}
for (k=0;k<len;k++){
arr[k] = arrtmp[k];
}
free(arrtmp);
}

3、testmysort.c是个辅助测试的模块,调用mysortlib.c中的函数,通过宏#define sortfunc ×××每次测试一个。输出信息对估量排序函数有比较大的帮助。
输出类似如下:

< [ 35687,3377,49990,58351,12237 ]
> [ 3377,12237,35687,49990,58351 ]
---------------------------------
< [ 35687,3377,49990,58351,12237,64841,62230,41585,52580,18926 ]
> [ 3377,12237,18926,35687,41585,49990,52580,58351,62230,64841 ]
---------------------------------
< [ 35687,3377,49990,58351,12237,64841,62230,41585,52580,18926,46382,40611,49858,20665,2984,60676,24442,59752,8288,21844 ]
> [ 2984,3377,8288,12237,18926,20665,21844,24442,35687,40611,41585,46382,49858,49990,52580,58351,59752,60676,62230,64841 ]
---------------------------------
< [ 35687,3377,49990,58351,12237,64841,62230,41585,52580,18926,46382,40611,49858,20665,2984,60676,24442,59752,8288,21844,51890,13460,36039,20282,49485,9391,25777,41009,52448,1089,7594,22600,4466,57585,15416,49470,24123,12112,25521,43935 ]
> [ 1089,2984,3377,4466,7594,8288,9391,12112,12237,13460,15416,18926,20282,20665,21844,22600,24123,24442,25521,25777,35687,36039,40611,41009,41585,43935,46382,49470,49485,49858,49990,51890,52448,52580,57585,58351,59752,60676,62230,64841 ]
---------------------------------
sorted 1000000 used: 0.327s
sorted 2000000 used: 0.676s
sorted 4000000 used: 1.398s
sorted 8000000 used: 2.883s
sorted 1000000 used: 0.176s when same
sorted 2000000 used: 0.371s when same
sorted 4000000 used: 0.782s when same
sorted 8000000 used: 1.639s when same
sorted 1000000 used: 0.176s (inc) | sort 1000000 used: 0.177s (desc)
sorted 2000000 used: 0.371s (inc) | sort 2000000 used: 0.371s (desc)
sorted 4000000 used: 0.780s (inc) | sort 4000000 used: 0.779s (desc)
sorted 8000000 used: 1.639s (inc) | sort 8000000 used: 1.635s (desc)

4、最后git commit好,心里比较踏实了。

 

【实习记】2014-08-10(上)代码跟踪git的想法+归并排序的debug过程的更多相关文章

  1. openstack学习笔记一 虚拟机启动过程代码跟踪

    openstack学习笔记一 虚拟机启动过程代码跟踪 本文主要通过对虚拟机创建过程的代码跟踪.观察虚拟机启动任务状态的变化,来透彻理解openstack各组件之间的作用过程. 当从horizon界面发 ...

  2. 在Ubuntu 12.10 上安装部署Openstack

    OpenStack系统有几个关键的项目,它们能够独立地安装但是能够在你的云计算中共同工作.这些项目包括:OpenStack Compute,OpenStack Object Storage,OpenS ...

  3. trace与代码跟踪服务

    首先开篇引用<MVC2 2 in action>里面一段关于这个跟踪服务的话 When you called Trace.Write() in Web Forms, you were in ...

  4. 六星经典CSAPP-笔记(12)并发编程(上)

    六星经典CSAPP-笔记(12)并发编程(上) 1.并发(Concurrency) 我们经常在不知不觉间就说到或使用并发,但从未深入思考并发.我们经常能"遇见"并发,因为并发不仅仅 ...

  5. 2014年10月底/终于/HTML5定稿……/技术从来不会成为发展的绝对瓶颈/反而商业成了无法逾越的鸿沟【转载+整理】

    原文地址 本文内容 一.HTML5 诞生 二.HTML5 第一阶段: Web 增强与打破垄断 三.HTML5 第二阶段: 移动互联网 四.HTML5 这回真的来了 五.颠覆原生 App 六.还有什么会 ...

  6. NASA的10条代码编写原则

    NASA的10条代码编写原则 作者: Gerard J. Holzmann 来源: InfoQ 原文链接 英文原文:NASA's 10 Coding Rules for Writing Safety ...

  7. 实习记——《Rethink》

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/gmszone/article/details/30045055 最终能够在和自己的电脑上写下这些字了 ...

  8. 解Bug之路-记一次线上请求偶尔变慢的排查

    解Bug之路-记一次线上请求偶尔变慢的排查 前言 最近解决了个比较棘手的问题,由于排查过程挺有意思,于是就以此为素材写出了本篇文章. Bug现场 这是一个偶发的性能问题.在每天几百万比交易请求中,平均 ...

  9. AM335x tscadc platform driver 相关代码跟踪

    TI AM335x ti am335x_tsc.c 代码跟踪 在kernel 首层目录: 先运行make ARCH=arm tags 这个作用是建立tags文件,只含有arm架构的,利用ctag即可进 ...

随机推荐

  1. web.xml 详解contextConfigLocation 转

    spring的应用初始化流程一直没有搞明白,刚刚又碰到了相关的问题.决定得好好看看这个流程.我们在开发spring的项目当中基本上都会在web.xml通过: <context-param> ...

  2. typedef用法小结

    typedef用法小结- - 注意:本文转自网络,版权归原作者所有. typedef typedef用法小结- - 这两天在看程序的时候,发现很多地方都用到typedef,在结构体定义,还有一些数组等 ...

  3. DBI接口和DPI接口的区别

    1)DBI接口 A,也就是通常所讲的MCU借口,俗称80 system接口.The lcd interface between host processor and LCM device list a ...

  4. MongoDB Java 连接配置

    [前言] 由于处于线程安全等考虑,MongoDBJava从3.0开始已经打算废弃DB开头的类的使用,所以整体调用上有了较大的区别,特以此文志之 [正文] 环境配置 在Java程序中如果要使用Mongo ...

  5. [转载]通过jQuery的attr修改onclick

    var js = "alert('B:' + this.id); return false;"; // creates a function from the "js&q ...

  6. bzoj1827 [Usaco2010 Mar]gather 奶牛大集会

    不就是移一下树根,回溯一下吗? 诶?黄学长为什么可以直接找? 诶?这不是重心吗? YY了一下证明 很简单 由于重心max{sz[v]} <= sz[u] / 2的性质,可以证明每一步远离重心的移 ...

  7. BZOJ2253 2010 Beijing wc 纸箱堆叠 CDQ分治

    这题之前度娘上没有CDQ分治做法,gerwYY出来以后写了一个.不过要sort3遍,常数很大. gerw说可以类似划分树的思想优化复杂度,但是蒟蒻目前不会划分树(会了主席树就懒得去弄了). 嗯 将me ...

  8. Bootstrap-基于bootstrap的后台二级垂直菜单

    最近做一个后台的管理项目,用到了Twitter推出的bootstrap前端开发工具包,是一个基于css3/html5的框架.花周末时间,写了一个非常简单后台的菜单.首先,看一下菜单的结构: 预览地址  ...

  9. 如何将ER图转换成关系模式集

    在ER图中,主要是实体类型和联系类型. 1.实体类型的转换 (“——”表示对应关系) 实体类型——关系模式 实体的属性——关系模式的属性 实体标识符——关系模式的键 2.联系的转换 一元联系较简单,三 ...

  10. hdu 4622 Reincarnation(后缀数组)

    hdu 4622 Reincarnation 题意:还是比较容易理解,给出一个字符串,最长2000,q个询问,每次询问[l,r]区间内有多少个不同的字串. (为了与论文解释统一,这里解题思路里sa数组 ...