鍊錶的插入排序:
本吊昨天想到乙個及其刮三的演算法,因為我還是習慣了原來的,每次insert都是陣列從後往前找合適的插入位點,然而鍊錶是從前往後移動外層迴圈指標的,
於是將前面sortedlist逆置,最後遍歷完之後再倒置一邊,雖然說也是o(n^2)的演算法,但是不僅笨拙,而且**複雜,除錯複雜,本吊昨天愣是沒調出來就不高興調了。
後來在路上一想,是不是不需要這麼複雜,記得原來ds課好像也沒這麼複雜的。於是網上稍微搜了下別人解法,**短得多!!
於是稍微看了下,發現自己智商捉急了!
我完全沒有根據具體的ds因地制宜,說明沒有掌握insertsort最本質的東西,而是只學會了表面的copy。
insertsort是假設前面部分已經有序,現在將後面的元素逐一插入到前面的array,使得有序陣列長度+1,逐漸擴充到整個陣列。為啥array是從前往後呢,因為線性表插入麻煩,需要後移騰出位置來,
於是從後往前判斷的同時可以後移元素,豈不一舉兩得?何樂而不為呢。說白了,裡層迴圈做的事情是將後面元素插入到前面部分,使之有序,具體怎麼插,看具體的ds,前後開始都可以的。而link是插入非常高效的ds,並且從前面head開始訪問更方便,
因此當然選擇前面開始遍歷找插入位點了,本吊沒有靈活運用。
附上本吊的**:
listnode *insertionsortlist(listnode *head)
else//at least one loop
qprev->next=p;
p->next=q;
} p=pnext;
} return head;
}
另附上本吊還沒調好的逆置鍊錶的繁瑣演算法,引以為鑑:
listnode *insertionsortlist(listnode *head)
if(looptimes==0)//p as new head
else
if(pnext==null)
break;//p points to last node
p=pnext;//p moves to original next
} //reverse link list with head of p;
listnode*prev=null, *reversedhead=p;
while(p!=null)
return prev;
}
鍊錶插入排序
void insertsort list sortascount,node node else p prior next q q next p int sortwithinsetmethod list sortasdata wchar pp p data if isnum pp int i 0 i ...
鍊錶插入排序
題目 用插入排序對鍊錶排序 樣例 given1 3 2 0 null,return0 1 2 3 null 思路 新建乙個以dummy開頭的鍊錶,並將dummy賦初值為0。令node dummy,通過移動新煉表中的node與要排序的鍊錶中的head,並比較node與head的值,來實現排序。如果he...
鍊錶插入排序
題目 用插入排序對鍊錶排序 思路 建立乙個新的鍊錶,將目標鍊錶依次插入先煉表中,小就插到前面,大就插到後面,如此一來,新的鍊錶就是目標鍊錶按大小次序排列的了。先看第一步,將目標鍊錶的第乙個元素插入所建立的空鍊錶,具體是先建立乙個地值存下頭節點的下乙個節點的位置,將頭節點的next變為空,連到一開始建...