插入排序和希尔排序算法学习

在以前的学习过程只学习过冒泡排序和快速排序。自己又通过在网络的学习,记录学习一下,插入排序和希尔排序

插入排序,相关动图显示,可以帮助理解

相关动图 是从网络上找的,感谢设计者。我这里整理一下,做成笔记,供自己学习记录用。


#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&&LT((*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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值