栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【21天学习挑战赛】直接插入排序

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【21天学习挑战赛】直接插入排序

​

直接插入排序
    • 思路过程:
    • 算法图解:
    • 代码(c语言):
    • 评价:
    • 实战演练:

活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。

思路过程:

原有序列的基础上,从左至右依次扫描,为每个扫描到元素找到在前面找到合适的位置。

算法图解:

代码(c语言):
//直接插入排序法
#include 
 
void Compare(int arr[], int len)
{
	int i = 0;
	for (i = 0; i < len-1; i++)//len减一因为要插入的数是i+1
	{
		int M = i;//记录有序列表最后应该元素下标
		int num = arr[i + 1];//要插入的数
		while (M >= 0)
		{
			if (num < arr[M])//继续比较
			{
				arr[M + 1] = arr[M];//交换数值
				M--;
			}
			else
			{
				break;
			}
		}
		arr[M + 1] = num;
	}
}
评价:

适用于基本有序序列,元素个数较小的序列

实战演练:

题目链接:147. 对链表进行插入排序

题目思路:

从前往后找插入点,初始时有序序列只有一个元素,每次将一个新的元素插入到有序序列中,将有序序列的长度增加 1,直到全部元素都加入到有序序列中。

代码:

struct ListNode *insertionSortList(struct ListNode *head) {
    if (head == NULL) {
        return head;
    }
    struct ListNode *dummyHead = malloc(sizeof(struct ListNode));
    dummyHead->val = 0;
    dummyHead->next = head;
    struct ListNode *lastSorted = head;
    struct ListNode *curr = head->next;
    while (curr != NULL) {
        if (lastSorted->val <= curr->val) {
            lastSorted = lastSorted->next;
        } else {
            struct ListNode *prev = dummyHead;
            while (prev->next->val <= curr->val) {
                prev = prev->next;
            }
            lastSorted->next = curr->next;
            curr->next = prev->next;
            prev->next = curr;
        }
        curr = lastSorted->next;
    }
    return dummyHead->next;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1033081.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号