详细解析直接插入排序和希尔排序

直接插入排序:

    (1) 基本思想:

            每一趟将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上,直到所有待排序记录全部插入为止。

   直接用一个事例来解释说明:

   给一无序的数列:49,38,65,97,76,13,27,49

   对于这个进行直接插入排序,如图:

代码:

#include<stdio.h>

void InsertSort(int *arr,int len) //直接插入排序
{
	int tmp=arr[0];
	for(int i=0;i<len;i++)
	{
		int j=i-1;     //j始终在i的后面
		tmp=arr[i];       //tmp保存数组arr的值,作为标记
		while(j>=0 && arr[j]>tmp)     //当大于的时候就交换
		{
			arr[j+1]=arr[j]; 
			--j;        //如果一次交换没有调整完全,就回退,继续比较交换
		}
		arr[j+1]=tmp;   //更新保存的tmp值
	}
}

void show(int*arr,int len)
{
	for(int i=0;i<len;i++)
	{
		printf("%d\n",arr[i]);
	}
	printf("\n");
}

int main()
{
	int arr[]={12,45,5,17,26,3,82,36,45,23,79};
	int len=sizeof(arr)/sizeof(arr[0]);
	InsertSort(arr,len);
	show(arr,len);
	return 0;
}

 

 希尔排序

   (1)希尔排序是基于插入排序的以下两点性质而提出的改进方法:

             1.插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。

              2.但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。

   (2)基本思想:

             这种方法是一种分组插入排序。就是说 比较相隔较远距离(称之为增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素进行交换。

             算法先将排序的一组数按某个增量d分成若干个分组,每组记录的下标相差d。对每一个组内的全部元素进行排序,然后再用一个小的增量对它进行,在每组中再进行排序,当增量减到1的时候,整个要排序的数被分析一组,排序完成。

             给一个完全无序的数列,然后运用希尔排序进行升序排序:

             增量序列的取值依次为:5,3,1

       如图:

代码:

void Shell(int *arr,int len,int dk) //传进来的dk是具体的增量值
{
	int tmp=0;
	for(int i=dk;i<len;i++) 
	{
		tmp=arr[i];
		int j=i-dk;
		for(j;j>=0 && arr[j]>tmp;j-=dk)
		{
			arr[j+dk]=arr[j]; //仍然相当于直接插入,距离是增量距离而已
		}
		arr[j+dk]=tmp;
	}
}
void ShellSort(int *arr,int len,int dk[],int dlen)// 加一个增量数组
{
	int i=0;
	for(i;i<dlen;i++)  //当小于增量数组长度的时候,说明还没分组完,就一直循环
	{
		Shell(arr,len,dk[i]); 
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值