歸併排序(單向鍊錶 陣列實現)

2021-09-18 06:55:42 字數 1113 閱讀 4496

/*

歸併排序

(演算法交換鍊錶節點,時間複雜度o(nlogn),不考慮遞迴棧空間的話空間複雜度是o(1))

首先用快慢指標的方法找到鍊錶中間節點,然後遞迴的對兩個子鍊錶排序,

把兩個排好序的子鍊錶合併成一條有序的鍊錶。歸併排序應該算是鍊錶排序最佳的選擇了,

保證了最好和最壞時間複雜度都是nlogn,

而且它在陣列排序中廣受詬病的空間複雜度在鍊錶排序中也從o(n)降到了o(1)

*/node_t* get_mid(node_t* head)

//slow最後指向有n個元素的鍊錶的第n/2個元素。

//如一共6個元素,slow指向第3個,一共5個元素,slow指向第2個。

return slow;

}node_t* merge(node_t* newleft, node_t* newright)

else

tail=newlist;

tail->next = null;

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

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

else if (newright == null)

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

else

}return newlist; //返回新接好的list

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

#include#include#include#includeusing namespace std;

void merge(int a,int l,int r,int mid)

else if(j>r)

else if(aux[i-l]>aux[j-l])

else

} }

void merge_sort(int a,int l,int r)

void mergesort(int a,int l,int r)

單向鍊錶排序 快速排序和歸併排序

對單向鍊錶的排序有2種形式,只改變節點的值和只改變鏈結 節點 struct listnode 歸併排序是最適合單鏈表排序的演算法,因為兩個鍊錶的歸併比較簡單,和陣列的歸併過程思路相同。需要注意的是 如何找到鍊錶的中點?通過2個快慢指標,快指標每一步走2個節點,慢指標每一步走1個節點,當快指標到達鍊錶...

歸併排序的鍊錶實現

利用歸併法可以對鍊錶進行排序,而且不需要占用額外空間.對於乙個無序鍊錶,先利用迴圈找到鍊錶的中值,再利用遞迴先將乙個鍊錶分成兩個鍊錶,逐步遞迴,遞迴停止的條件是鍊錶中只有乙個元素或是沒有元素的情況,然後完成鍊錶的有序.include include include include include i...

鍊錶歸併排序

include include include include include using namespace std typedef int type typedef struct nodetag node node build type a,int n pnode pnext null retu...