手把手教你實現鍊錶的歸併排序

2021-08-10 12:01:36 字數 2694 閱讀 7412

參考資料:《資料結構與演算法分析》(第三版英文版)

書本題目:7.20 (269頁)

這個題目的意思很簡單,就是實現鍊錶的歸併排序

先實現乙個簡單的節點node結構

struct node 

node()

};

再到鍊錶

struct list 

};

在main函式裡面測試鍊錶是否成功

int main() 

system("pause");

}

執行程式,成功按順序列印出數值

下面是鍊錶歸併函式的實現

node* listmergesort(node* head) //傳入需要歸併排序的鍊錶的頭指標

//slow最後指向有n個元素的鍊錶的第n/2個元素。如一共6個元素,slow指向第3個,一共5個元素,slow指向第2個。

node* left = head;

node* right = slow->next;

slow->next = null;

//但是實際上將鍊錶截斷,左邊的部分從第1個開始,右邊的要從第4個(共6個)或者第3個(共5個)開始,所以有right=slow->next;

//假設上面截斷的左右兩個子鍊錶呼叫歸併排序後變成了排好序(new,新)的「新」左右兩個鍊錶,然後開始歸併

node* newleft = listmergesort(left);

node* newright = listmergesort(right);

node * newlist ; //注意指標tail才是後面進行操作的指標,newlist是為了儲存起點

node * tail ;

if (newleft->data < newright->data)

else

tail=newlist ;

tail->next = null;

//以上**是向newlist的第乙個節點存入左右兩個鍊錶的頭節點的較小的元素

while (newleft != null|| newright != null)//在&&和||之間踩了大坑,調了乙個多小時的bug,讓我罵一句真是mmp

else if (newright == null)

else if (newleft->data < newright->data)

else

} return newlist; //返回新接好的list,美滋滋。

}

再貼上main函式**

int main() 

node* newhead = listmergesort(list.head);

cout << endl;

node * temp ;

for (int i = 0; i < 10; i++)

system("pause");

}

最後貼上完整**

# include using namespace std;

struct node

node() };

struct list };

node* listmergesort(node* head)// n list裡面節點的個數

node* left = head;

node* right = slow->next;

slow->next = null;

node* newleft = listmergesort(left);

node* newright = listmergesort(right);

node * newlist ;

node * tail ;

if (newleft->data < newright->data)

else

tail=newlist ;

tail->next = null;

while (newleft != null|| newright != null)

else if (newright == null)

else if (newleft->data < newright->data)

else

} node *temp = newlist;

return newlist;

}int main()

node* newhead = listmergesort(list.head); //這裡把list的頭節點直接進去了2333333,不優雅.。。。

cout << endl;

node * temp ;

for (int i = 0; i < 10; i++)

system("pause");

}

一共137行**,感覺實現還是蠻優雅的呵呵~(臭不要臉),當然在給那個newlist的頭節點加資料的時候**有點冗餘。。。

鍊錶從頭節點來分有兩種,我的是頭節點儲存元素的那類鍊錶。

開始時想把 node* listmergesort(node* head) 這個函式的引數帶入乙個整形引數n (鍊錶元素個數)的,這樣好通過n/2求煉表中點,後來看到這個部落格裡面的slow-fast方法。果斷用這個方法2333333

參考資料 

手把手教你看路由表

教你如何讀懂路由表,你能讀懂路由表嗎?不懂?進來看看吧!原 當前的路由 destination 目的網段 mask 子網掩碼 inte ce 到達該目的地的本路由器的出口ip gateway 下一跳路由器入口的ip,路由器通過inte ce和gateway定義一調到下乙個路由器的鏈路,通常情況下,i...

實現sigmoid 手把手教你自己動手實現神經網路

階躍函式是指一旦輸入超過閾值,就切換輸出的函式。上述感知機中使用的就是該種啟用函式,一旦a大於0則,輸出變為1.上述感知機的階躍函式圖形如下,從圖中可以看出該階躍函式以0為界,輸出從0切換為1 或從1切換為0 值呈階梯式變化,因此稱為階躍函式。sigmoid函式與階躍函式對比 sigmoid函式 右...

python版比較器 手把手教你學會(含鍊錶)

比較器,過載比較運算子 對於任意的比較器,首先需要指定兩個數o1,o2 對返回值有統一的規範 返回負數時,認為o1應該排在o2的前面 返回正數時,認為o2應該排在o1的前面 返回0 時,誰排在前面都可以 例子1 官方給的是從小到大排序 a 4,5,6,9,8,2,4,6,3,8,4 b sorted...