直接插入排序
int insertsort(int x[],int n) { int i,j,t; for(i=0;i<n;i++) { t=x[i]; for(j=i;j>=0&&x[j-1]>t;j--) { x[j]=x[j-1]; } x[j]=t; } }
折半插入
void BiInsertionSort(SqList &L){ //对顺序表L作折半插入排序 for(i=2; i<=L.length; ++i){ L.r[0] = L.r[i]; low = 1; high = i-1; //查找i记录应该插入的位置,必定是high+1的位置从而high+1位置以后的元素都应该往后移动一个位置,留出一个位置放入L.r[i] while(low <= high){ mid = (low + high)/2; if(LT(L.r[0], L.r[m].key)) high = m - 1; else low = m + 1; } //后移 for(j=i-1; j>=high+1; --j) L.r[j+1] = L.r[j]; //插入元素 L.r[high+1] = L.r[0]; } }
希尔排序
void ShellSort(SqList *L) { int i,j; int increment=L->length; do { increment=increment/3+1; /* 增量序列 */ for(i=increment+1;i<=L->length;i++) { if (L->r[i]<L->r[i-increment]) /* 需将L->r[i]插入有序增量子表 */ { L->r[0]=L->r[i]; /* 暂存在L->r[0] */ for(j=i-increment;j>0 && L->r[0]<L->r[j];j-=increment) L->r[j+increment]=L->r[j]; /* 记录后移,查找插入位置 */ L->r[j+increment]=L->r[0]; /* 插入 */ } } } while(increment>1); }