排序專題 -- (1)插入排序

皮皮黃的皮皮橙發表於2020-11-21

(1)簡單插入排序以順序表作為儲存結構

void InsertSort(int a[], int n)
{
	for(int i = 1; i < n; ++i)
	{
		if(a[i] < a[i-1])
		{
			temp = a[i];
			for(int j = i; a[j] > temp && j > 0; --j)
			{
				a[j] = a[j-1];
			}
			a[j] = temp;
		}
	}
}

(2)以連結串列作為儲存結構【leetcode 147】

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution 
{
public:
    ListNode* insertionSortList(ListNode* head) 
    {
        if(head == nullptr || head->next == nullptr)
            return head;
		// 創立一個啞節點,引入啞節點是為了便於在 head 節點之前插入節點
		ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;
        // 指標p表示插入排序之前已經有序部分的最大值(即最後一個節點)
		// q表示無序的第一個, 需要新加入排序的節點
		ListNode* p = head, *q = p->next;    
		while(q != nullptr)
		{
			if(p->val <= q->val)
				p = p->next;
			else
			{
				ListNode* pre = dummyHead;
				// 插在pre之後的位置
				while(pre->next->val <= q->val)
					pre = pre->next;
				// 把當前q插入到pre後
				p->next = q->next;
				q->next = pre->next;
				pre->next = q;
			}
			q = p->next;			// 新節點的位置在已經排序完成之後的一個位置
		}
		return dummyHead->next;
    }
};

相關文章