來自資料結構與演算法書
進行鍊錶排序並避免建立,刪除新的節點
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 ...