二路插入排序详解
2012-02-03 17:20 youxin 阅读(1905) 评论(0) 编辑 收藏 举报二路插入排序设置两个变量first,final,把第一个数当成pivot,比它小则往前插,越小越往前插;比它大就往后插,
越大越往后插,源码如下:
1 #include <stdio.h>
2 #define MAXSIZE 100
3
4 typedef int elemtype;
5
6 void BiInsertsort(elemtype buffer[],int length){
7 elemtype tmp[MAXSIZE+1];
8 int first,final,med;
9 int i,j;
10 tmp[1]=buffer[1];
11 first=2;final=MAXSIZE; //first,final分别指向待插入的位置.first在前,final在后
12 med=1; //作为中轴
13 for(i=2;i<=length;i++){
14 if(buffer[i]<tmp[med]){ //插前部,最小的在first
15 for(j=first;j-1>med&&buffer[i]>tmp[j-1];j--) tmp[j]=tmp[j-1];
16 tmp[j]=buffer[i];
17 first++;
18 }
19 else { //插后部
20 for(j=final;j+1<=MAXSIZE&&buffer[i]<tmp[j+1];j++) tmp[j]=tmp[j+1]; //最大的在final
21 tmp[j]=buffer[i];
22 final--;
23 }
24 }//for
25 for(i=first-1,j=1;i>0;i--) buffer[j++]=tmp[i];
26 for(i=MAXSIZE;i>final;i--) buffer[j++]=tmp[i];
27 }
28
29 void main(){
30 int i=0;
31 int j=0;
32 elemtype buffer[MAXSIZE+1];
33 puts("Input the number,and finish with any char:");
34 while(scanf("%d",&buffer[++i])); //i比元素个数多1 MARK!!!
35 BiInsertsort(buffer,i-1); //0号单元未使用
36 for(j=1;j<i;j++) printf("%d ",buffer[j]);
37 }
分析如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通