插入排序 (直接插入排序与希尔排序)

一、直接插入排序

如图所示:直接插入排序

1.直接插入排序基本思想:


把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。
 

2.直接插入排序的原理:


当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上 比  要插入的元素  大的元素要顺序后移
 

3.直接插入排序的代码:

void InsertSort(int *a, int n)//直接插入排序
{
    int i = 0;

    //[0,n-2]是最后一组,
    //[0,end]有序,end+1位置的值插入[0,end],保持有序
    for (i = 0; i < n - 1; i++)
    {
        int end = i;
        int temp = a[end + 1]; //[0,end]是有序,将end+1处的数字与end处比较,如果小于就将其
                            //向内移动,将大的数字向后移动
        while (end>=0)  //循环在end为-1时终止
        {
            if ((a[end] > temp))  //要插入的元素大于右边的边界元素
            {
                a[end + 1] = a[end];   //将右边的边界元素向右移
                end -= 1;
            }
            else      
            {
                break;
            }
        }
        a[end + 1] = temp;//将end+1位置处的值赋为要插入的数字
    }
}

 

4.直接插入排序的特性总结:


1. 元素集合越接近有序,直接插入排序算法的时间效率越高
2. 时间复杂度:O(N^2)
3. 空间复杂度:O(1)
4. 稳定性:稳定
 

二、希尔排序

1.希尔排序的基本思想:


(1)先进行预排序(让数组接近有序)
(2)后进行插入排序

希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数 (gap),把待排序文件中所有记录分成多个组,所有距离为的gap的记录分在同一组内,并对每一组内的记录进行排序。然后,取gap=gap/3+1(+1保证最后一个gap一定是1),重复上述分组和排序的工作。当到达gap==1时,所有记录在统一组内排好序
 

2.希尔插入排序的原理:


预排序时

所有数据分成gap组,每一组都进行插入排序,在本组调整成从小到大的顺序
gap越大,大的可以越快跳到后面,小的数可以越快跳到前面,越不接近有序gap越小,跳得越慢,但是越接近有序。

当gap==1相当于直接插入排序就有序了

3.希尔排序的代码:

void ShellSort(int *a,int n)//希尔排序
{
    int i;
    int gap = n;//gap为分组的距离大小
    while (gap > 1)    //循环,直到gap等于1时,排序就完成了
    {
        //+1保证最后一个gap一定是1
        //gap>1是预排序
        //gap==1是直接插入排序
        gap = gap / 3 + 1;
        for (i = 0; i < n-gap; i++)  //使得每一组都成为小到大的顺序
        {
            int end = i;
            int temp = a[end + gap];
            while (end>=0)
            {
                if (temp < a[end])
                {
                    a[end + gap] = a[end];
                    end -= gap;
                }
                else
                {
                    break;
                }
            }
            a[end + gap] = temp;
       }
    }
}

4.希尔排序的图例

5.希尔排序的特性总结:

1. gap越大,大的可以越快跳到后面,小的数可以越快跳到前面,越不接近有序gap越小,跳得越慢,但是越接近有序。当gap==1相当于直接插入排序就有序了
2. 时间复杂度:O(N^1.3)
3. 空间复杂度:O(1)
4. 稳定性:不稳定
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值