环境:
[lanux@localhost--Debug--15:29]$uname -sr
Linux 2.6.34.7-61.fc13.i686.PAE
[lanux@localhost--Debug--15:32]$rpm -qa|grep anjuta
anjuta-doc-2.30.2.1-1.fc13.noarch
anjuta-2.30.2.1-1.fc13.i686
anjuta-devel-2.30.2.1-1.fc13.i686
[lanux@localhost--Debug--15:33]$
此shell排序对增量序列作简单化假设,假设为{0,1,5,19,41}。
C代码:
一趟shell排序:
<textarea cols="50" rows="15" name="code" class="cpp">//一趟shell排序 int oneSortShell( int *SqList, int delt, int len) { if( delt<0 || len<0 || (SqList==NULL) ) return(0); for( int i=1; i<(delt+1); i++) { /*子序列中插入排序*/ for( int j=(i+delt); j<(len+1); j=j+delt ) { int k=0; /*将j插入前面已排好序列*/ SqList[0]=SqList[j]; for( k=j-delt; (k>0) && (SqList[0]<SqList[k]) ; k=k-delt ) { /*如果SqList[0]和SqList[k]相等就不移动,维持其稳定性*/ SqList[k+delt]=SqList[k]; }//for 一趟插入排序 SqList[k+delt]=SqList[0]; }//for }//各子序列插入排序 return(1); }</textarea>
增量序列假设:
<textarea cols="50" rows="15" name="code" class="cpp">//全局变量shell排序增量序列,假设如下: int incrementSeq[4+1]={0,1,5,19,41};//作示范性假设</textarea>
shell排序:
<textarea cols="50" rows="15" name="code" class="c-sharp">/*对无序表希尔排序,区间为【1,len】,无序表长度为len+1*/ /*SqList: 无序表 incrTable: 增量序列,一般为{1,5,19,41,109...} tlen: 增量序列长度,这里区间也是【1,tlen】 len: 无序表长度,区间【1,len】 为非递减排序,已考虑保持稳定性*/ int ShellSort( int *SqList, int *incrTable, int tlen, int len) { if( tlen<0 || len<0 || (SqList==NULL) || (incrTable==NULL)) return(0); for( int j=tlen; j>0; j-- ) { oneSortShell(SqList,incrTable[j],len); } return(1); }</textarea>
结果示例:
[lanux@localhost--Debug--15:33]$./shellsort
array number fallow as:
841 372 566 967 201 692 967 94 192 486
784 308 96 922 452 43 433 429 519 856
962 780 830 910 316 265 932 547 194 491
The shell sort follow:
43 94 96 192 194 201 265 308 316 372
429 433 452 486 491 519 547 566 692 780
784 830 841 856 910 922 932 962 967 967
[lanux@localhost--Debug--15:46]$
2010-12-03 15:47:00