/***************************************************/
/* Description:一、插入排序法:直插+折半+希尔(C语言源代码)
/* Date:2021/9/7
/* Author:汝南城
/****************************************************/
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 1000
/*插入排序算法基于的顺序表存储结构*/
typedef int KeyType;
typedef struct{
KeyType key;
char name[10];//other info
}RedType;
typedef struct {
RedType r[MAXSIZE + 1];
int length;
}SqList;
/*①直接插入排序法:从后到前一个一个依次比较*/
void Direct_Insert_Sort(SqList* L)
{
int i,j;
for (i = 2; i <= L->length; i++)
{
if (L->r[i].key < L->r[i - 1].key)
{
L->r[0] = L->r[i]; /*比较,设置哨兵*/
for (j = i - 1;L->r[0].key < L->r[j].key; j--)
{
L->r[j + 1] = L->r[j]; /*比较,后移*/
}
L->r[j + 1] = L->r[0];
}
}
}
/*②折半插入排序:用折半查找算法找到插入的位置*/
void Bin_Sert_Sort(SqList* L)
{
int i;
for (i = 2; i <= L->length; ++i)
{
L->r[0] = L->r[i];
int low = 1, high = i - 1;
while (low <= high)
{
int mid = (low + high) / 2;
if (L->r[0].key < L->r[mid].key)
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
for (int j = i - 1; j >= high + 1; --j)
{
L->r[j + 1] = L->r[j];
}
L->r[high + 1] = L->r[0];
}
}
/*③希尔排序法(单次)*/
void Shell_Insert(SqList* L,int dk)
{
int i,j;
for (i = dk + 1; i <= L->length; i += dk)
{
if (L->r[i].key < L->r[i - dk].key)
{
L->r[0] = L->r[i];
for (j = i - dk; j > 0 && (L->r[0].key < L->r[j].key); j -= dk)
{
L->r[j + dk] = L->r[j];
}
L->r[j + dk] = L->r[0];
}
}
}
/*④希尔排序法(多次)*/
void Shell_Sort(SqList* L,int t,int dt[])
{
int k;
for (k = 0; k < t; k++)
{
Shell_Insert(L,dt[k]);
}
}
void main()
{
SqList* L1 = (SqList*)malloc(sizeof(SqList));
RedType i;
L1->length = 0;
for (i.key = 100; i.key > 90; i.key--)
{
L1->r[101 - i.key].key = i.key;
L1->length++;
}
for (int j = 1; j <= 10; j++)
{
printf("%d ",L1->r[j].key);
}
printf("\n");
/*①直接插入排序法:从后到前一个一个依次比较*/
//Direct_Insert_Sort(L1);
/*②折半插入排序*/
//Bin_Sert_Sort(L1);
/*③希尔排序法(单次)*/
/*Shell_Insert(L1,2);
for (int j = 1; j <= 10; j++)
{
printf("%d ", L1->r[j].key);
}
printf("\n");
Shell_Insert(L1,1);
for (int j = 1; j <= 10; j++)
{
printf("%d ", L1->r[j].key);
}*/
/*④希尔排序法(多次)*/
int shelldt[2] = { 1,2 };
Shell_Sort(L1, 2, shelldt);
for (int j = 1; j <= 10; j++)
{
printf("%d ", L1->r[j].key);
}
}