准备工作
#include <cstdio>
#include <random>
#define Maxsize 20
typedef int KeyType;
typedef struct {
KeyType key;
}RedType;
typedef struct {
RedType data[Maxsize];
int length;
}SqList;
void Print(SqList L,int i)
{
for (; i <L.length ; ++i) {
printf("%d ",L.data[i].key);
}
printf("\n");
}
直接插入排序(稳定)
数组0作为哨兵 一个一个排序,数组中的第一个元素天然有序,因此,从2开始,如果第二个元素小于前面一个元素,则需要找到插入位置,通过移动覆盖值,最终找到目标元素的存放位置 跳出第二层循环的时候,j指向目前位置的前一个位置。有哨兵的存在,所以不用担心数组越界 归纳推广,就可以写出如下代码
void D_insert_sort(SqList &L)
{
int j;
for (int i = 2; i <=L.length ; ++i) {
if(L.data[i-1].key>L.data[i].key)
{
L.data[0]=L.data[i];
for ( j = i-1; L.data[j].key>L.data[0].key ; j--) {
L.data[j+1]=L.data[j];
}
L.data[j+1]=L.data[0];
}
}
}
折半插入排序(二分排序)稳定)
void B_insert_sort(SqList &L)
{
//哨兵
int high,low,mid;
for (int i = 2; i <=L.length ; ++i) {
L.data[0]=L.data[i];
high=i-1,low=1;
while (low<=high)
{
mid=(high+low)/2;
if(L.data[mid].key>L.data[0].key)
{
high=mid-1;
} else{
low=mid+1;
}
}
for (int j =i-1; j>= high; j--) {
L.data[j+1]=L.data[j];
}
//找到了目标位置当前high指向值<目标的位置才跳出循环 pos=high+1
L.data[high+1]=L.data[0];
}
}
希尔排序
void Shell_insert(SqList &L,int dk)
{
int j;
for (int i = dk+1; i <=L.length ; ++i) {
if(L.data[i-dk].key>L.data[i].key)
{
L.data[0]=L.data[i];
for ( j = i-dk; j>0&&L.data[j].key>L.data[0].key ; j-=dk) {
L.data[j+dk]=L.data[j];
}
L.data[j+dk]=L.data[0];
}
}
}
void Shell_insert_sort(SqList &L,int dk[],int t)
{
for (int i = 0; i <t ; ++i) {
Shell_insert(L,dk[i]);
}
}
2173

被折叠的 条评论
为什么被折叠?



