1 void BiSelectSort( int a[ ], int n ) /* 双向选择排序函数 */
2 { int i, j, k, kmax, kmin, t;
3 for( i=0, j=n-1; i<j; ++i, --j )
4 { kmin=kmax=i;
5 for( k=i+1; k<=j; ++k ) //一趟扫描找出最大值和最小值
6 { if( a[k]<a[kmin] ) kmin=k;
7 if( a[k]>a[kmax] ) kmax=k;
8 }
9 //区分四种情况,分别进行处理,通常没有被人意识到而导致错误
10 if( kmin==j && kmax==i ) //1.
11 { t=a[i];
12 a[i]=a[j];
13 a[j]=t;
14 }
15 // else if( kmin==j && kmax!=i ) //2.省略这种情况,可在第四种情况下处理
16 // { t=a[i];
17 // a[i]=a[kmin];
18 // a[kmin]=a[i];
19 // t=a[j];
20 // a[j]=a[kmax];
21 // a[kmax]=t;
22 // }
23 else if( kmax==i && kmin!=j ) //3.
24 { t=a[j];
25 a[j]=a[kmax];
26 a[kmax]=t;
27 t=a[i];
28 a[i]=a[kmin];
29 a[kmin]=t;
30 }
31 else //4.
32 { if( kmin!=i )
33 { t=a[i];
34 a[i]=a[kmin];
35 a[kmin]=t;
36 }
37 if( kmax!=j )
38 { t=a[j];
39 a[j]=a[kmax];
40 a[kmax]=t;
41 }
42 }
43 }
44 }