标签:空间复杂度 int 排序 思想 nod start 结果 oid 堆排序
链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)
用到的链表结构如下所示:
1 struct ListNode 2 { 3 int val; 4 ListNode* next; 5 };
一、直接交换结点
1、直接插入排序【时间复杂度:O(n^2),空间复杂度:O(1)】
插入排序的基本思想:将待排序表看作是左、右两部分,其中左边为有序区,右边为无序区;整个排序过程就是将右边无序区中的记录依次按关键字大小逐个插入到左边有序区中,以构成新的有序区,直到全部记录都排好序。
如:
初始序列: [12] 15 09 20 06 36 28
第一趟结果:[12 15] 09 20 06 36 28
第二趟结果:[09 12 15] 20 06 36 28
第三趟结果:[09 12 15 20] 06 36 28
第四趟结果:[06 09 12 15 20] 36 28
第五趟结果:[06 09 12 15 20 36] 28
第六趟结果:[06 09 12 15 20 28] 36
代码如下所示:
1 void InsertionSortList() 2 {
//head为头指针 3 if (head == NULL || head->next == NULL) //若链表为空,返回 4 { 5 return; 6 } 7 ListNode *p = head->next->next; 8 9 ListNode* pend = head->next; 10 11 while (p) 12 { 13 //ListNode *tmp = pstart->next, *pre = pstart; 14 ListNode *tmp = head->next, *pre = head; 15 16 while (tmp != p && p->val >= tmp->val) //找到插入位置 17 { 18 tmp = tmp->next; 19 pre = pre->next; 20 } 21 if (tmp == p) 22 { 23 pend = p; 24 } 25 else 26 { 27 pend->next = p->next; 28 p->next = tmp; 29 pre->next = p; 30 } 31 p = pend->next; 32 } 33 34 return ; 35 }
标签:空间复杂度 int 排序 思想 nod start 结果 oid 堆排序
原文地址:https://www.cnblogs.com/t11383/p/10405763.html