1)直接插入排序
//直接插入排序,进行增序排序
void InsertSort(SqlList &L){
//从第2个元素开始,进行i-1轮插入
for(int i=2;i<=L.length;i++){
//如果待插入元素与之前元素比较已经属于有序,无需操作,否则执行操作
if(L.r[i].key<L.r[i-1].key){
//复制待插入元素为哨兵
L.r[0]=L.r[i];
for(int j=i-1;L.r[0].key<L.r[j].key;j--) //比待插入元素大的都往后移
L.r[j+1]=L.r[j];
L.r[j]=L.r[0];
} //if
} //for
} //InsertSort2)折半插入排序
void BInsertSort(SeqList &L)
{
//从第二个元素开始把待排序序列插入到有序序列
for(int i=2;i<=L.length;i++)
{
L.r[0]=L.r[i];
int low=1,high=i-1; //从第i-1个元素(有序序列的最后一个元素)开始往前找空
while(low<=high){ //当low=high,还执行一次,将mid与low,high指向相同位置,并因此会执行else语句,使high+1位置为待插入元素的位置
mid=(low+high)/2;
if(L.r[mid].key<L.r[0].key) low=mid+1;
else high=mid-1;
} //循环结束,high+1为插入位置
for(int j=i-1;j>high+1;--j) L.r[j+1]=L.r[j];
L.r[high+1]=L.r[0];
}
}3)希尔排序
//一趟增量为dk的希尔排序
void ShellSort(SeqList &L,int dk){
for(i=dk+1;i<=L.length;i++){ //从dk+1个元素开始,把无序子序列的元素插入有序序列
if(L.r[i]<L.r[i-dk]){ //当第i个元素比他前面子序列的元素要小,则执行,否则已经有序,无需操作
L.r[0]=L.r[i]; //复制为哨兵
for(j=i-dk;j>0&&(L.r[0].key<L.r[j].key);j-=dk) //比L.r[i]大的元素后移空位置
L.r[j+dk]=L.r[j];
L.r[j]=L.r[0];
}
}
}
京公网安备 11010502036488号