国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

C語言數(shù)據(jù)結(jié)構(gòu) 鏈表與歸并排序?qū)嵗斀?/h1>
2020-01-26 14:16:59
字體:
供稿:網(wǎng)友

C語言數(shù)據(jù)結(jié)構(gòu) 鏈表與歸并排序?qū)嵗斀?/strong>

歸并排序適合于對鏈表進(jìn)行原址排序,即只改變指針的連接方式,不交換鏈表結(jié)點(diǎn)的內(nèi)容。

歸并排序的基本思想是分治法:先把一個鏈表分割成只有一個節(jié)點(diǎn)的鏈表,然后按照一定順序、自底向上合并相鄰的兩個鏈表。

只要保證各種大小的子鏈表是有序的,那么最后返回的鏈表就一定是有序的.

歸并排序分為分割和合并兩個子過程。分割是用遞歸的方法,把鏈表對半分割成兩個子鏈表;合并是在遞歸返回(回朔)的時候,把兩個有序鏈表合并成一個有序鏈表。

繪圖1

(注意:只有一個節(jié)點(diǎn)的鏈表一定是有序的)

這里sort過程就是分割過程;merge過程就是合并且排序的過程

說到分割鏈表,那么問題來了:鏈表不是隨機(jī)訪問的,我怎么知道分割點(diǎn)在哪里?一個寶貴的經(jīng)驗(yàn)就是:維護(hù)兩個指針,一快一慢。快指針每次后移兩個單位,慢指針每次只移動一個單位。當(dāng)快指針移動到tail或者最后一個有效節(jié)點(diǎn)時,慢指針就指向了中間的節(jié)點(diǎn)。

sort過程:

Node* sort (Node* beg){  if(beg==tail || beg->next==tail) return beg;  Node* a = beg; Node* b = beg->next;  while(b!=tail && b->next != tail)  {    a = a->next; b = b->next->next;  }  b = a->next;  //the beginning of right part  a->next = tail; //the end of left part  return merge(sort(beg), sort(b));}

把鏈表分割之后就要合并。merge操作傳入的參數(shù)是兩個有序鏈表,返回的是合并后的有序的鏈表。兩個有序鏈表簡單拼接之后不一定是有序的,需要對每一個元素重排。這個重排的過程是從兩個鏈表各自最小(最大)元素開始,誰小(大)就把誰放到新的鏈表里。

merge1

Node* LinkedList<T>::merge(Node* a, Node* b){	Node dummy = Node();	Node* head = &dummy;	// temp是正在合并的表的節(jié)點(diǎn)	Node* temp = head;	while(a!=tail && b!=tail) //逐個比較鏈表a和鏈表b的每個元素	{		if(a->data <= b->data)		{			// 如果a比b小, 那么當(dāng)前結(jié)點(diǎn)的后繼就是a			temp->next = a;			// 把當(dāng)前節(jié)點(diǎn)移向后繼			temp = a;			// a后移			a = a->next;		}		else 		{			temp->next = b;			temp = b; 			b = b->next;		}		// 如果原表a已經(jīng)排完,那么新表后面就放b的剩余元素		// 否則仍然以a為標(biāo)準(zhǔn)和b進(jìn)行比較		temp->next = (a==tail) ? b : a;	}	return head->next;}

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 华宁县| 沙河市| 巴青县| 双鸭山市| 师宗县| 桦南县| 辽宁省| 绥化市| 溧水县| 无锡市| 叶城县| 平山县| 麦盖提县| 高雄市| 贡嘎县| 临武县| 涡阳县| 祁阳县| 榆林市| 宝清县| 景宁| 宁陵县| 兰西县| 泰兴市| 定襄县| 建宁县| 同仁县| 靖西县| 南投县| 绥滨县| 柳林县| 晋江市| 鄂托克旗| 瓦房店市| 湘潭市| 泸西县| 盐池县| 汾阳市| 房山区| 娄烦县| 湖州市|