單鏈表的插入排序(詳細圖解說明)

題目:實現一個單鏈表的插入排序



如圖所示,解決這個問題的關鍵
(1)首先必須維護當前節點的前指針,
(2)然後還要維護要插入的位置的前後指針,
(3)每個要插入的節點都要從頭開始比較。
算法如下:
void InsertSort(List l)
		p = l;    //p,q用來維護插入位置的前後指針
		q = l.next;
		r = q;    //r,s用來維護當前帶插入的前後指針
		s = r.next;
		while(s)
		{
			while( !q.equals(s)&& s.data > q.data)  //如果q != s, p,q下移
			{
				p = p.next;
				q = q.next;
			}
			if(q.equals(s))   //當跳出的循環條件是q == s時,說明s比前面的都大,不用插入
			{
				p = l;
				q = l.next;
				r = r.next;
				s = s.next;
			}
			else            //當跳出的條件是s.data > q.data時,
			{
				//這是交換節點
				r.next = s.next;
				s.next = q;
				p.next = s;
				//讓s指向它原先的下一個,繼續進行這個過程
				s = r.next;
				//讓p,q回到起始位置,以便下一個插入時從頭進行比較
				p = l;
				q = l.next;
			}
		}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章