參考資料:《資料結構與演算法分析》(第三版英文版)
書本題目: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...