在以前的学习过程只学习过冒泡排序和快速排序。自己又通过在网络的学习,记录学习一下,插入排序和希尔排序
插入排序,相关动图显示,可以帮助理解
相关动图 是从网络上找的,感谢设计者。我这里整理一下,做成笔记,供自己学习记录用。
#include <stdio.h>
#define MAXSIZE 15 //一个用作示例的小顺序表的最大长度
#define LT(a,b) ((a)<(b))
#define LQ(a,b) ((a)<=(b))
typedef struct
{
int r[MAXSIZE+1]; //r[0]闲置或用作哨兵单元
int length; //顺序表长度
}SqList_sort; //顺序表类型
void InsertSort(SqList_sort *L)
{
int i, j;
for(i=2; i<=(*L).length; i++)
{
if(LT((*L).r[i], (*L).r[i-1])) //"<",需将L.r[i]插入有序子表
{
(*L).r[0] = (*L).r[i]; //复制为哨兵
(*L).r[i] = (*L).r[i-1];
for(j=i-1; LT((*L).r[0], (*L).r[j]); --j)
(*L).r[j+1] = (*L).r[j]; //记录后移
(*L).r[j+1] = (*L).r[0]; //插入到正确位置
}
}
}
int main(int argc, char *argv[])
{
SqList_sort L;
int i;
int data[16] = {0,23,4,5,7,76,45,54,56,76,55,22,11,55,78,86 };
L.length = 15;
L.r[0] = 0;
printf("before\n");
for( i = 1; i <= L.length; i++)
{
L.r[i] = data[i];
printf("%d ",L.r[i]);
}
InsertSort(&L);
printf("\nafter\n");
for(i = 1; i <= L.length; i++)
{
printf("%d ",L.r[i]);
}
return 0;
}
希尔排序,相关动图显示,可以帮助理解
#include <stdio.h>
#define MAXSIZE 15 //一个用作示例的小顺序表的最大长度
#define LT(a,b) ((a)<(b))
#define LQ(a,b) ((a)<=(b))
int t = 3; //增量序列容量
int dlta[] = {5, 3, 1}; //增量序列
typedef struct
{
int r[MAXSIZE+1]; //r[0]闲置或用作哨兵单元
int length; //顺序表长度
}SqList_sort; //顺序表类型
void ShellInsert(SqList_sort *L, int dk)
{
int i, j;
for(i=dk+1; i<=(*L).length; i++) //dk为前后记录的位置增量,r[0]作暂存单元
{
if(LT((*L).r[i], (*L).r[i-dk])) //将L.r[i]插入有序增量子表
{
(*L).r[0] = (*L).r[i]; //暂存在L.r[0]
for(j=i-dk; j>0&<((*L).r[0], (*L).r[j]); j-=dk)
(*L).r[j+dk] = (*L).r[j]; //记录后移,查找插入位置
(*L).r[j+dk] = (*L).r[0]; //插入
}
}
}
void ShellSort(SqList_sort *L, int dlta[], int t)
{
int k;
for(k=0; k<t; k++)
ShellInsert(L, dlta[k]); //一趟增量为dlta[k]的插入排序
}
int main(int argc, char *argv[])
{
SqList_sort L;
int i;
int data[16] = {0,23,4,5,7,76,45,54,56,76,55,22,11,55,78,86 };
L.length = 15;
L.r[0] = 0;
printf("before\n");
for( i = 1; i <= L.length; i++)
{
L.r[i] = data[i];
printf("%d ",L.r[i]);
}
ShellSort(&L, dlta, t);
printf("\nafter\n");
for(i = 1; i <= L.length; i++)
{
printf("%d ",L.r[i]);
}
return 0;
}