活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。
活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。
思路过程:
原有序列的基础上,从左至右依次扫描,为每个扫描到元素找到在前面找到合适的位置。
算法图解:
代码(c语言):
//直接插入排序法
#include <stdio.h>
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;
}
结果展示: