插入排序

  3 void insertSort (int *a, int length)
  4 {
  5     int i, j, temp;
  6 
  7     for (j = 1; j != length; j++)
  8     {
  9         temp = *(a + j);
 10         i = j - 1;
 11 
 12         while (i >= 0 && *(a + i) > temp)
 13         {
 14             *(a + i + 1) = *(a + i);
 15             i--;
 16         }
 17 
 18         *(a + i + 1) = temp;
 19     }
 20 }


第一层循环用于确定排序次数,即length - 1次

第二个循环用于移位,j 是用于确定要排的数,插到前面已经排序的里面


如同插扑克牌,写的时候先回忆一下过程


#include <stdio.h>

void insertSort (int *a, int length)
{
    int i, j, temp, k, mid;

    for (j = 1; j != length; j++)
    {
        temp = *(a + j);
        i = j;
        k = 0;
                
        while (k <= i)
        {
            mid = (i + k) / 2;
            if (*(a + mid) > temp)
            {
                i  = mid - 1;
            }
            else 
                k = mid + 1;
        }

        for (i = j - 1; i >= k; i--)
            *(a + i + 1) = *(a + i);

        *(a + k) = temp;
    }
}

在插入寻找插入点的时候通过二分查找,这对数组来说没有一点帮助,最后的for循环还是要进行,

但是如果时链表的话就不一样了

void insertSort (int* a, int n)
{
	if (n == 1)
		return;

	insertSort (a, n - 1);
	
	int i = n - 2;
	int temp = *(a + n - 1);
	while (i >= 0 && *(a + i) > temp)
	{
		*(a + i + 1) = *(a + i);
		i--;
	}

	*(a + i + 1) = temp;
}

分治的思想,每次都是把后一个插到前面 ,第10个插到前面已经排好序的9个数中 ==》将第9个插到前8个有序数中,递归到

n = 1的时候回归,那时有2个数,第二个插到第一个,第3个插前2个,以此类推

因为这样要递归n此,所以时间复杂度仍然为n2


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值