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

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

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

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


#include 

#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;
}

插入排序和希尔排序算法学习_第1张图片

希尔排序,相关动图显示,可以帮助理解

#include 

#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

插入排序和希尔排序算法学习_第2张图片

你可能感兴趣的:(C,数据结构)