直接插入排序与希尔排序的思想及算法实现

一、直接插入排序


思想:1)把一个数组分为已排序和未排序的两个部分  

2)从未排序的部分取出一个数据,把这个数据暂时存放在临时量中  

3)从已排序的部分找到待排序数据的合适位置  

4)直接插入该数据


注意:若是数据量非常大的数组排序,则所需移动的次数非常多,效率低下。所以,直接插入排序适用于数据量小,较为有序的数组。


稳定性:稳定

时间复杂度:O(n^2) 空间复杂度:O(1)


**代码实现**


#include<stdio.h>
#include<string.h>
#include<assert.h>


void InsertSort(int arr[],int len)
{
    int i , j ,tmp;
    for(i = 1;i < len; ++i)
    {
        tmp = arr[i];
        for(j = i - 1;j >= 0 && arr[j] > tmp; --j)
        {
            arr[j+1] = arr[j];
        }
        arr[j+1] = tmp;
    }
}

int main()//测试用例
{
    int arr[] = {1,9,6,8,12,76,3};
    int len = sizeof(arr)/sizeof(arr[0]);
    InsertSort(arr, len);
    for(int i = 0;i<len;++i)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");
    return 0;
}

二、希尔排序

思想:把一个数组按照增量划分为不同的数据组,对于每一个数据组进行组内排序,通过增量的减小使整个数据组有序


增量的选择规律:1)选择素数 2)最后一个增量必须为1


稳定性:不稳定

时间复杂度:不定 空间复杂度:O(1)


**代码实现** 


//  希尔排序

void Shell(int arr[],int len,int dk)//dk:增量
{
    int i , j ,tmp;
    for(i = dk;i < len; ++i)
    {
        tmp = arr[i];
        for(j = i - dk;j >= 0 && arr[j] > tmp; j = j - dk)
        {
            arr[j+dk] = arr[j];
        }
        arr[j+dk] = tmp;
    }
}

void ShellSort(int arr[],int arr_len,int dka[],int dka_len)
{
    for(int i = 0 ; i< dka_len; ++i)
    {
        Shell(arr, arr_len, dka[i]);
    }
}

int main()//测试用例
{
    int arr[] = {1,16,9,6,23,8,12,76,3,1};
    int len = sizeof(arr)/sizeof(arr[0]);
    int dka[] = {5,3,1};
    int dka_len = sizeof(dka)/sizeof(dka[0]);
    ShellSort(arr, len, dka,dka_len);
    for(int i = 0;i<len;++i)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值