插入排序
程序员文章站
2022-03-21 23:17:46
...
一.简单插入排序
void Insertsort(SqList *L) { for(i=2; i<=L.lenth; i++) if(L.elem[i].key < L.elem[i-1].key) { L.elem[0] = L.elem[i]; for(j=i-1; L.elem[0].key < L.elem[j].key; j--) L.elem[j+1] = L.elem[j]; L.elem[j+1] = L.elem[0]; } }
二.折半插入排序
void BinInsertsort(SqList *L)
{
for(i=2; i<=L.lenth; i++){
L.elem[0] = L.elem[i];
low = 1;
high = i-1;
//折半查找
while(low <= high){
mid = (low+high)/2;
if(L.elem[0].key < L.elem[mid].key)
high = mid - 1;
else
low = mid + 1;
}
for(j = i+1; j >= high+1; --j)
L.elem[j+1] = L.elem[j];
L.elem[high+1] = L.elem[0];
}
}
三.希尔插入排序
基本思想
1.采用跳跃分割法进行数据分组,间隔因子d为等差。
2.组内采用插入排序。
3.采用多次分组,渐进基本有序。
4.保障最后一次分组间隔为1,即全局排序。
PS:d的选择目前还是世界难题
void ShellInsert(SqList *L)
{
for(i=dk+1; i<=L.lenth; i++)
if(L.elem[i].key < L.elem[i-dk].key)
{
L.elem[0] = L.elem[i];
for(j=i-dk; j>0&&L.elem[0].key<L.elem[j].key; j-=dk)
L.elem[j+dk] = L.elem[j];
L.elem[j+dk] = L.elem[0];
}
}