鍊錶的歸併排序,插入排序

2021-09-01 19:29:16 字數 1839 閱讀 2276

來自資料結構與演算法書

進行鍊錶排序並避免建立,刪除新的節點

1.node是結構體模板,linklist是類模板

using namespace std;

template

struct node

;template

class linklist

;

2 歸併排序

template 

void linklist::

merge_sort()

tail=p;

}//merge_sort的意義在於可以把私有成員head傳給recursive_merge_sort作為引數

//recursive_merge_sort的引數是乙個指標的引用,可以改變指標的指向。

//我們需要改變head的指向,但不可以在main中用gethead()作為引數,它return head後返回值是個臨時變數,不能對它取引用,因為函式完成後棧中資料就會銷毀。

//tail的指向要額外改

//若把gethead()返回值賦給另乙個指標變數,然後把它作為引數傳給recursive_merge_sort()也沒有用,因為改變的只是另乙個指標變數的指向,不是head的指向。

template

void linklist::

recursive_merge_sort

(node

*& sub_list)

}template

node

* linklist::

divide

(node

* sub_list)

} second=midpoint->next;

midpoint->next=

null

;//用null代替中間鏈,把鍊錶分成兩份

return second;

}template

node

* linklist::

merge

(node

* first,node

* second)

else}if

(first!=

null

)//不同於陣列的歸併排序,只要把乙個節點鏈上去所有的就鏈上去了

else

return combined.next;

}

如果不用啞結點,要考慮頭結點的特殊情況。返回值是指向new出來的空間的指標,所以不會出錯。

template 

node

* linklist::

merge

(node

* first,node

* second)

else

}else

else}}

if(first!=

null

)else

return combined;

}

3 插入排序

template 

void linklist::

insert_sort()

//insert element into the already sorted part(between head and lastsorted)

else

if(current==first_unsorted)

//insert after lastsorted

else

//insert behond head and before lastsorted}}

}}``

插入排序 歸併排序

插入排序 define len 5 int a len void insertion sort void int i,j,k for j 1 j len j k a j i j 1 while i 0 a i k a i 1 a i i a i 1 k 歸併排序 int a 8 void merge...

插入排序 歸併排序

演算法導論初涉,第一講練習內容 include define n 6 int a n void init 初始化陣列 a i 1 k void output int a,int n void merge int low,int mid,int high while s mid b i a s whi...

插入排序 歸併排序

一直沒自己寫過 然後自己寫了下 其實我主要查的wikipedia 插入排序 歸併排序 先插排 插入排序 英語 insertion sort 是一種簡單直觀的 排序演算法 它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序 在實現上,通常採用in ...