数据结构-直接插入排序和希尔排序

一.直接插入排序

算法思想

从第二个开始依次与前面的数进行比较,将其插入到合适的位置,使得它前面的数(包括它本身在内)有序。

代码实现

#include<stdio.h>

void InsertSort(int *arr,int len)
{
    int tmp;//用来保存用来排序(比较)的值
    int j;
    for(int i=1;i<len;i++)
    {
        tmp=arr[i];//保存第i个值
        for(j=i-1;j>=0;j--)//依次将第i个值(tmp),与前面的数进行比较
        {
            if(arr[j]>tmp)//如果前面的值比tmp大,就将其向后移一个,然后接着与前面的值进行比较
            {
                arr[j+1]=arr[j];
            }
            else//如果前面的值比tmp小,就说明第i个值已经在合适的位置了,也就是说它前面的(包括他在内)所有的数有序了
            {
                break;
            }
        }
        arr[j+1]=tmp;//此时j+1下标位置就是第i搁置合适的位置
    }
}

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

int main()
{
    int arr[]= {2,5,4,9,3,1,0,7,8,6};
    int len=sizeof(arr)/sizeof(arr[0]);
    InsertSort(arr,len);
    Show(arr,len);
}

时间复杂度O(N^2)

空间复杂度:O(1)

稳定性:稳定

算法特点:越有序越快

二.希尔排序

算法思想

1.先预排序:取一个小于N的整数gap作为第一次增量,然后将距离gap的元素放入一组,再对每一组进行直接插入排序。然后将gap缩小,作为第二增量,重复以上操作。

2.再直接插入排序:当gap缩小为1时,进行直接插入排序

3.希尔排序利用了gap越大,挪动数据的距离越大,效率更高;gap越小,挪动的距离越小,前面让gap较大,可以让数据更快的挪动到自己对应的位置附近,减少挪动次数,让数据部分有序,利用直接插入排序越有序越快的特性。

代码实现

//利用直接插入排序的思想只是将两个数从相邻变为相距gap
static void Shell(int* arr, int len, int gap)
{
	int tmp;
	int j;
	for (int i = gap; i < len; i++)
	{
		tmp = arr[i];
		for (j = i - gap; j >= 0; j -= gap)
		{
			if (arr[j] > tmp)
			{
				arr[j + gap] = arr[j];
			}
			else
			{
				break;
			}
		}
		arr[j + gap] = tmp;
	}
}

void ShellSort(int* arr, int len)
{
	int d[] = { 5,3,1 };//分组数,最后一个一定为1
	for (int i = 0; i < sizeof(d) / sizeof(d[0]); i++)
	{
		Shell(arr, len, d[i]);
	}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪星猫宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值