鍊錶插入排序之演算法根據具體DS因地制宜

2021-06-22 11:21:46 字數 1220 閱讀 3354

鍊錶的插入排序:

本吊昨天想到乙個及其刮三的演算法,因為我還是習慣了原來的,每次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變為空,連到一開始建...