環境:
[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排序:
//一趟shell排序<br />int oneSortShell( int *SqList, int delt, int len)<br />{<br />if( delt<0 || len<0 || (SqList==NULL) )<br />return(0);<br />for( int i=1; i<(delt+1); i++)<br />{<br />/*子序列中插入排序*/<br />for( int j=(i+delt); j<(len+1); j=j+delt )<br />{<br />int k=0;<br />/*將j插入前面已排好序列*/<br />SqList[0]=SqList[j];<br />for( k=j-delt; (k>0) && (SqList[0]<SqList[k]) ; k=k-delt )<br />{<br />/*如果SqList[0]和SqList[k]相等就不移動,維持其穩定性*/<br />SqList[k+delt]=SqList[k];<br />}//for 一趟插入排序<br />SqList[k+delt]=SqList[0];<br />}//for<br />}//各子序列插入排序<br />return(1);<br />}
增量序列假設:
//全域變數shell排序增量序列,假設如下:<br />int incrementSeq[4+1]={0,1,5,19,41};//作示範性假設
shell排序:
/*對無序表希爾排序,區間為【1,len】,無序表長度為len+1*/<br />/*SqList: 無序表<br /> incrTable: 增量序列,一般為{1,5,19,41,109...}<br /> tlen: 增量序列長度,這裡區間也是【1,tlen】<br /> len: 無序表長度,區間【1,len】<br /> 為非遞減排序,已考慮保持穩定性*/<br />int ShellSort( int *SqList, int *incrTable, int tlen, int len)<br />{<br />if( tlen<0 || len<0 || (SqList==NULL) || (incrTable==NULL))<br />return(0);<br />for( int j=tlen; j>0; j-- )<br />{<br />oneSortShell(SqList,incrTable[j],len);<br />}<br />return(1);<br />}
結果樣本:
[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