代码改变世界

二路插入排序详解

2012-02-03 17:20  youxin  阅读(1884)  评论(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 }

分析如下: