Shell排序与插入排序算法

目录

基于链表的插入排序

基于数组的插入排序

基于数组的Shell排序


基于链表的插入排序

https://blog.csdn.net/Doutd_y/article/details/81557320

ListNode * InsertionSort(ListNode *head)
{
    if (head == NULL)
        return 0;
    ListNode *sortedList = new ListNode(0);
    
    while (head != NULL)
    {
        ListNode *temp = head->next;
        ListNode *inser = sortedList;
        while (inser->next != NULL && inser->next->val < head->val)
        {
            inser = inser->next;
        }
        head->next = inser->next;
        inser->next = head;
        head = temp;
    }
}

基于数组的插入排序

1)首先都数组的前两个数据进行从小到大的排序

2)接着将第3个数据与排好序的两个数据比较,将第3个数据插到合适的位置

3)然后,将第4个数据插入到已排好序的前三个数据当中

4)不断重复上述过程,直到把最后一个元素插入到合适位置。

void InsertionSort(int *a, int len)
{
	int i, j, temp;
	for (i = 1; i < len; i++)
	{
		j = i - 1;  //j为当前大排序中的已排序序列的最后一个元素的下标
		temp = a[i]; // temp为当前待插入的数
		while (j >= 0 && temp < a[j]) //j>=0保证不出界,且当前待插入的数temp比a[j]小,则继续寻找temp要插入的位置j
		{
			a[j + 1] = a[j]; // temp值比较小,则a[j]向后移动,并更新位置j
			j--;
		}
		a[j+1] = temp; //退出while的时候j已经做了一次自减(j--),所以退出while代表找到了比temp小元素(下标为j),则将temp放在j的后面。
	}
}

基于数组的Shell排序

基于插入排序的思想:插入排序的算法复杂度为O(n^{2}),但如果序列为正序可提高到O(n),而且直接插入排序算法比较简单,希尔排序利用这两点得到了一种改进后的插入排序。

1)将n个元素的数组分为n/2个数字序列,第1个数据和第n/2+1个数据为一对,......。

2)一次循环使每一个序列对排好顺序。

3)然后,再变成n/4个序列,再次排序。

4)不断重复上述过程,直至序列减少为1个。

void ShellSort(int *a, int len)
{
	int i, j, gap;
	int temp;
	for (gap = len / 2; gap >= 1; gap /= 2) // 控制大的排序次数
	{
		for (i = gap; i < len; i++) // 以gap为步长,比较a[i]与a[i-gap]的大小,即temp与a[j]的大小
		{
			temp = a[i];
			j = i - gap;
			while (j >= 0 && temp < a[j]) // 寻找合适的插入位置,只不过步长为gap
			{
				a[j + gap] = a[j];
				j = j - gap;
			}
			a[j + gap] = temp;
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值