插入排序法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
b=0
第五步: 外循环开始
t=R[5] 1 ↖___╱ /* 千万注意!t在这时被赋值后在下面的程序中就是一个常量,记住t现在为 1 */ 内循环开始 j=4 1<R[4] √ 满足条件,执行下面的语句 R[5]=R[4] 100 ↖___╱ 经过上面的处理,原数组变为 3 4 5 6 100 100 内循环还没有结束! j-- j=3 1<R[3] √ 满足条件,执行下面的语句 R[4]=R[3] 6 ↖___╱ 经过上面的处理,原数组变为 3 4 5 6 6 100 内循环还没有结束! j-- j=2 1<R[2] √ 满足条件,执行下面的语句 R[3]=R[2] 5 ↖___╱ 经过上面的处理,原数组变为 3 4 5 5 6 100 内循环还没有结束! j-- j=1 1<R[1] √ 满足条件,执行下面的语句 R[2]=R[1] 4 ↖___╱ 经过上面的处理,原数组变为 3 4 4 5 6 100
b=0
第三步: 外循环开始 i=3
t=R[3] 3 ↖___╱ /* 千万注意!t在这时被赋值后在下面的程序中就是一个常量,记住t现在为 3 */ 内循环开始 j=2 3<R[2] √ 满足条件,执行下面的语句 R[3]=R[2] 6 ↖___╱ 经过上面的处理,原数组变为 4 5 6 6 100 1 内循环还没有结束! j-- j=1 3<R[1] √ 满足条件,执行下面的语句 R[2]=R[1] 5 ↖___╱ 经过上面的处理,原数组变为 4 5 5 6 100 1 内循环还没有结束! j-- j=0 3<R[0] √ 满足条件,执行下面的语句 R[1]=R[0] 4 ↖___╱ 经过上面的处理,原数组变为 4 4 5 6 100 1
t=R[1] 5 ↖__╱ /* 千万注意!t在这时被赋值后在下面的程序中就是一个常量,记住t现在为 5 */ 内循环开始 j=0 5<R[0] √ 满足条件,执行下面的语句 R[1]=R[0] 6 ↖____╱ 经过上面的处理,原数组变为 6 6 4 3 100 1 内循环还没有结束! j-- j=-1 此时不满足j>=0 跳出内循环 执行内循环下面的语句 R[0]=5 经过上面的处理,原数组变为 5 6 4 3 100 1
Байду номын сангаас
第六步: 外循环开始 i=6
此时不满足6<6 跳出外循环
到这个时候原数组就已经按照从小到大的顺序排列好了。
下面是使用测试程序 #include <stdio.h> #include <time.h> //...函数定义 void main() { int Array[30000]; int i=0,j; for(j=29999;j>=0;j--,i++) Array[i]=j; InsertSort(Array,30000); printf("本次测试用时: %d Ms\n",clock()); } 来源: http://www.programbbs.com/bbs/view35-20719-1.htm
b=0
内循环还没有结束! j-- j=-1 此时不满足j>=0 跳出内循环 执行内循环下面的语句 R[0]=3 经过上面的处理,原数组变为 3 4 5 6 100 1
第四步: 外循环开始 i=4
t=R[4] 100 ↖___╱ /* 千万注意!t在这时被赋值后在下面的程序中就是一个常量,记住t现在为 100 */ 内循环开始 j=3 100<R[3] ╳ b=1 此时不满足!b 跳出内循环 执行内循环下面的语句 R[4]=100 /* 相当于100没有变动 */
插入排序法.txt我不奢望什么,只希望你以后的女人一个不如一个。真怀念小时候啊,天 热的时候我也可以像男人一样光膀子!前面对选择排序和冒泡排序的单步跟踪破解都是一 帆风顺的,这次对插入排序的破解可谓是经历了一番波折,总共尝试了4次,第四次时才 成功,第三次足足花了我2个小时,一直在稿纸上演算,还是没有成功,当时我都要抓狂 了,第二天向老师请教了一下,忽然间就懂了,原来就是那个小小的知识点没有搞正确。 请注意下面用 /*...*/ 包含的内容,这就是我为什么一直错误的原因,我每次都把 t 当做R[i]处理,而这时R[i]的值已经不是原来的值了,已经被新值覆盖了,所以我误把 t 也换掉了。 注释:╳ 不成立;√ 成立 void InsertSort(int R[],int n) { int i,j,t,b; for(i=1;i<n;i++) { b=0; t=R[i]; for(j=i-1;j>=0 && !b;) if(t<R[j]) { R[j+1]=R[j]; j--; } else b=1; R[j+1]=t; } } 下面以一个具体例子来说明 原数组为 6 5 4 3 100 1 第一步: 外循环开始 i=1
b=0
第二步: 外循环开始 i=2
t=R[2] 4 ↖__╱ /* 千万注意!t在这时被赋值后在下面的程序中就是一个常量,记住t现在为 4 */ 内循环开始 j=1 4<R[1] √ 满足条件,执行下面的语句 R[2]=R[1] 6 ↖____╱ 经过上面的处理,原数组变为 5 6 6 3 100 1 内循环还没有结束! j-- j=0 4<R[0] √ 满足条件,执行下面的语句 R[1]=R[0] 5 ↖____╱ 经过上面的处理,原数组变为 5 5 6 3 100 1 内循环还没有结束! j-- j=-1 此时不满足j>=0 跳出内循环 执行内循环下面的语句 R[0]=4 经过上面的处理,原数组变为 4 5 6 3 100 1
i=5
b=0
内循环还没有结束! j-- j=0 1<R[0] √ 满足条件,执行下面的语句 R[1]=R[0] 3 ↖___╱ 经过上面的处理,原数组变为 3 3 4 5 6 100 内循环还没有结束! j-- j=-1 此时不满足j>=0 跳出内循环 执行内循环下面的语句 R[0]=1 经过上面的处理,原数组变为 1 3 4 5 6 100