插入排序一般分为两种,对数组进行插入排序和对链表进行插入排序,对数组进行插入排序比较简单,其代码如下:
//对数组进行插入排序
void insertSort(vector<int> nums){
for (int i = 0; i < nums.size(); i++){
for (int j = i; j>0; j--){
if (nums[j] < nums[j - 1]){
int temp = nums[j];
nums[j] = nums[j - 1];
nums[j - 1] = temp;
}
else{
break;
}
}
}
for (vector<int>::iterator itr = nums.begin(); itr != nums.end(); itr++){
cout << *itr << ' ';
}
}
以下主要讨论第二种,其代码如下:
//对链表进行插入排序
class Solution {
public:
ListNode* insertionSortList(ListNode* head) {
if (!head || !head->next)
return head;
ListNode *dummyhead = new ListNode(-1);//伪头指针
dummyhead->next = head;//head始终指向排序前第一个元素
ListNode *prev = head;
ListNode *node = head->next;
while (node)
{//if语句为了判断元素是否要插入到前面
if (node->val < prev->val)
{
ListNode* temp = dummyhead;
//while循环是为了判断元素的位置
while (temp->next->val < node->val)
{
temp = temp->next;//指针后移
}
prev->next = node->next;
node->next = temp->next;
temp->next = node;
node = prev->next;
}
else
{
prev = prev->next;
node = node->next;
}
}
return dummyhead->next;//返回新链表首元素
}
};
我们以链表 9->6->8->7为例对上图的代码进行分析,如下图所示,有几个点需要注意的地方:
1.prev指针始终指向排序前首部元素,即9;
2.head指针始终指向排序前首部元素,即9,可以看出head和prev的作用一样,故而有些重复,所以我们可以把上面的代码中prev部分删去,只用head表示即可(如下)。
3.node指针每次向后移动一位,直到node=NULL跳出循环;
4.temp指针是为了找到node结点的插入位置。如果比dummyhead->next所指向的元素大,则temp指针向后移动。
//对链表进行插入排序
class Solution {
public:
ListNode* insertionSortList(ListNode* head) {
if (!head || !head->next)
return head;
ListNode *dummyhead = new ListNode(-1);//伪头指针
dummyhead->next = head;//head始终指向排序前第一个元素
ListNode *node = head->next;
while (node)
{//if语句为了判断元素是否要插入到前面
if (node->val < head->val)
{
ListNode* temp = dummyhead;
//while循环是为了判断元素的位置
while (temp->next->val < node->val)
{
temp = temp->next;//指针后移
}
head->next = node->next;
node->next = temp->next;
temp->next = node;
node = head->next;
}
else
{
head = head->next;
node = node->next;
}
}
return dummyhead->next;//返回新链表首元素
}
};