插入排序和希尔排序

 

插入排序:从数组第二个元素开始,如果他比前一个元素小,那么用一个帮助空间将他存储起来,然后将他之前比他大的元素通通后移,将他插入最后一个后移的元素之前,对于一个基本有序的数列来说很快捷,时间复杂度为O(n^2);

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAXSIZE 10
typedef struct
{
	int r[MAXSIZE];
	int length;
}SqList;
void InsertSort(SqList *L)
{
	int i,j,temp;
	for(i=1;i<MAXSIZE;i++)
	{
		if(L->r[i]<L->r[i-1])/*从第二个元素开始如果比前一个元素小的*/
		{
			temp=L->r[i];/*保存当前元素*/
			for(j=i-1;j>=0&&L->r[j]>temp;j--)/*将在他之前比他大的全部往后移*/
			{
				L->r[j+1]=L->r[j];
			}
			L->r[j+1]=temp;
		}
	}
}

int main()
{
	SqList *L =(SqList*)malloc(sizeof(SqList));
	printf("排序前\n");
	int i;
	srand(time(NULL));
	for(i=0;i<10;i++)
	{
		L->r[i]=rand()%15+1;
		L->length++;
		printf("%d ",L->r[i]);
	}
	printf("\n");
	InsertSort(L);
	printf("排序后:\n");
	for(i=0;i<MAXSIZE;i++)
	{
		printf("%d ",L->r[i]);
	}
	printf("\n");
	
	return 0;
}

 希尔排序:也是插入排序,不过插入排序的增量序列是1,而希尔排序的增量序列随着循环而改变,一般初始默认维数组长度的1/3+1,他的时间复杂度为O(n^3/2);

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAXSIZE 10
typedef struct
{
	int r[MAXSIZE];
	int length;
}SqList;
void ShellSort(SqList *L)
{
	int i,j,temp;
	int increment=L->length;
	do
	{
		increment = increment/3+1;/*增量序列*/
		for(i=increment;i<L->length;i++)
		{
			if(L->r[i]<L->r[i-increment])/*如果当前元素小于之前的元素*/
			{
				temp = L->r[i];
				for(j=i-increment;j>=0&&temp<L->r[j];j-=increment)/*将前面所有比他大的元素往后移increment个单位*/
				{
					L->r[j+increment]=L->r[j];
				}
				L->r[j+increment]=temp;/*将该元素插入到哪*/
			}
		}
	}
	while(increment>1);
}
int main()
{
	SqList *L =(SqList*)malloc(sizeof(SqList));
	printf("排序前\n");
	int i;
	srand(time(NULL));
	for(i=0;i<10;i++)
	{
		L->r[i]=rand()%15+1;
		L->length++;
		printf("%d ",L->r[i]);
	}
	printf("\n");
	ShellSort(L);
	printf("排序后:\n");
	for(i=0;i<MAXSIZE;i++)
	{
		printf("%d ",L->r[i]);
	}
	printf("\n");
	
	return 0;
}

 

 

点赞