国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

這個 歸并排序詳解過程 我能吹一輩子?。?!

這篇具有很好參考價值的文章主要介紹了這個 歸并排序詳解過程 我能吹一輩子?。?!。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

歸并排序概念

1945年,約翰·馮·諾依曼(John von Neumann)發(fā)明了歸并排序,這是典型的分治算法的應(yīng)用。

歸并排序(Merge sort)是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法(Divide and Conquer)的一個非常典型的應(yīng)用。將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。

歸并排序算法思路

歸并排序算法有兩個基本的操作,一個是分,也就是把原數(shù)組劃分成兩個子數(shù)組的過程。另一個是治,它將兩個有序數(shù)組合并成一個更大的有序數(shù)組。

1> 將待排序的線性表不斷地切分成若干個子表,直到每個子表只包含一個元素,這時,可以認為只包含一個元素的子表是有序表。
2> 將子表兩兩合并,每合并一次,就會產(chǎn)生一個新的且更長的有序表,重復(fù)這一步驟,直到最后只剩下一個子表,這個子表就是排好序的線性表。
這個 歸并排序詳解過程 我能吹一輩子?。?!

相信大家都知道如何將兩個有序序列合為一個有序序列吧:
這個 歸并排序詳解過程 我能吹一輩子?。?!

那么如何得到有序的子序列呢?當(dāng)序列分解到只有一個元素或是沒有元素時,就可以認為是有序了,這時分解就結(jié)束了,開始合并:
這個 歸并排序詳解過程 我能吹一輩子?。。? referrerpolicy=

歸并排序遞歸實現(xiàn)

歸并排序,從其思想上看就很適合使用遞歸來實現(xiàn),并且用遞歸實現(xiàn)也比較簡單。其間我們需要申請一個與待排序列大小相同的數(shù)組用于合并過程兩個有序的子序列,合并完畢后再將數(shù)據(jù)拷貝回原數(shù)組。

代碼示例:

//歸并排序(子函數(shù))
void _MergeSort(int* a, int left, int right, int* tmp)
{
	if (left >= right)//歸并結(jié)束條件:當(dāng)只有一個數(shù)據(jù)或是序列不存在時,不需要再分解
	{
		return;
	}
	int mid = left + (right - left) / 2;//中間下標
	_MergeSort(a, left, mid, tmp);//對左序列進行歸并
	_MergeSort(a, mid + 1, right, tmp);//對右序列進行歸并
	int begin1 = left, end1 = mid;
	int begin2 = mid + 1, end2 = right;
	//將兩段子區(qū)間進行歸并,歸并結(jié)果放在tmp中
	int i = left;
	while (begin1 <= end1&&begin2 <= end2)
	{
		//將較小的數(shù)據(jù)優(yōu)先放入tmp
		if (a[begin1] < a[begin2])
			tmp[i++] = a[begin1++];
		else
			tmp[i++] = a[begin2++];
	}
	//當(dāng)遍歷完其中一個區(qū)間,將另一個區(qū)間剩余的數(shù)據(jù)直接放到tmp的后面
	while (begin1 <= end1)
		tmp[i++] = a[begin1++];
	while (begin2 <= end2)
		tmp[i++] = a[begin2++];
	//歸并完后,拷貝回原數(shù)組
	int j = 0;
	for (j = left; j <= right; j++)
		a[j] = tmp[j];
}
//歸并排序(主體函數(shù))
void MergeSort(int* a, int n)
{
	int* tmp = (int*)malloc(sizeof(int)*n);//申請一個與原數(shù)組大小相同的空間
	if (tmp == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}
	_MergeSort(a, 0, n - 1, tmp);//歸并排序
	free(tmp);//釋放空間
}

時間復(fù)雜度:O(N*logN)??空間復(fù)雜度:O(N)

歸并排序非遞歸實現(xiàn)

歸并排序的非遞歸算法并不需要借助棧來完成,我們只需要控制每次參與合并的元素個數(shù)即可,最終便能使序列變?yōu)橛行颍?br>這個 歸并排序詳解過程 我能吹一輩子!!!
當(dāng)然,以上例子是一個待排序列長度比較特殊的例子,我們?nèi)羰窍雽懗鲆粋€廣泛適用的程序,必定需要考慮到某些極端情況:

情況一
?當(dāng)最后一個小組進行合并時,第二個小區(qū)間存在,但是該區(qū)間元素個數(shù)不夠gap個,這時我們需要在合并序列時,對第二個小區(qū)間的邊界進行控制。
這個 歸并排序詳解過程 我能吹一輩子?。。? referrerpolicy=

情況二
?當(dāng)最后一個小組進行合并時,第二個小區(qū)間不存在,此時便不需要對該小組進行合并。
?這個 歸并排序詳解過程 我能吹一輩子!??!

情況三
?當(dāng)最后一個小組進行合并時,第二個小區(qū)間不存在,并且第一個小區(qū)間的元素個數(shù)不夠gap個,此時也不需要對該小組進行合并。(可與情況二歸為一類)
?這個 歸并排序詳解過程 我能吹一輩子!??!

只要把控好這三種特殊情況,寫出歸并排序的非遞歸算法便輕而易舉了。

代碼示例:

//歸并排序(子函數(shù))
void _MergeSortNonR(int* a, int* tmp, int begin1, int end1, int begin2, int end2)
{
	int j = begin1;
	//將兩段子區(qū)間進行歸并,歸并結(jié)果放在tmp中
	int i = begin1;
	while (begin1 <= end1&&begin2 <= end2)
	{
		//將較小的數(shù)據(jù)優(yōu)先放入tmp
		if (a[begin1] < a[begin2])
			tmp[i++] = a[begin1++];
		else
			tmp[i++] = a[begin2++];
	}
	//當(dāng)遍歷完其中一個區(qū)間,將另一個區(qū)間剩余的數(shù)據(jù)直接放到tmp的后面
	while (begin1 <= end1)
		tmp[i++] = a[begin1++];
	while (begin2 <= end2)
		tmp[i++] = a[begin2++];
	//歸并完后,拷貝回原數(shù)組
	for (; j <= end2; j++)
		a[j] = tmp[j];
}
//歸并排序(主體函數(shù))
void MergeSortNonR(int* a, int n)
{
	int* tmp = (int*)malloc(sizeof(int)*n);//申請一個與待排序列大小相同的空間,用于輔助合并序列
	if (tmp == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}
	int gap = 1;//需合并的子序列中元素的個數(shù)
	while (gap < n)
	{
		int i = 0;
		for (i = 0; i < n; i += 2 * gap)
		{
			int begin1 = i, end1 = i + gap - 1;
			int begin2 = i + gap, end2 = i + 2 * gap - 1;
			if (begin2 >= n)//最后一組的第二個小區(qū)間不存在或是第一個小區(qū)間不夠gap個,此時不需要對該小組進行合并
				break;
			if (end2 >= n)//最后一組的第二個小區(qū)間不夠gap個,則第二個小區(qū)間的后界變?yōu)閿?shù)組的后界
				end2 = n - 1;
			_MergeSortNonR(a, tmp, begin1, end1, begin2, end2);//合并兩個有序序列
		}
		gap = 2 * gap;//下一趟需合并的子序列中元素的個數(shù)翻倍
	}
	free(tmp);//釋放空間
}

時間復(fù)雜度:O(N*logN)??空間復(fù)雜度:O ( N )文章來源地址http://www.zghlxwxcb.cn/news/detail-454043.html

到了這里,關(guān)于這個 歸并排序詳解過程 我能吹一輩子?。?!的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 歸并排序的具體實現(xiàn)過程

    歸并排序的具體實現(xiàn)過程

    作者主頁: paper jie的博客_CSDN博客-C語言,算法詳解領(lǐng)域博主 本文作者: 大家好,我是paper jie,感謝你閱讀本文,歡迎一建三連哦。 本文錄入于 《算法詳解》專欄,本專欄是針對于大學(xué)生,編程小白精心打造的。筆者用重金(時間和精力)打造,將算法基礎(chǔ)知識一網(wǎng)打盡,希望

    2024年02月12日
    瀏覽(20)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】歸并排序詳解:歸并排序算法,歸并排序非遞歸實現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)與算法】歸并排序詳解:歸并排序算法,歸并排序非遞歸實現(xiàn)

    歸并排序是一種經(jīng)典的排序算法,它使用了分治法的思想。下面是歸并排序的算法思想: 遞歸地將數(shù)組劃分成較小的子數(shù)組,直到每個子數(shù)組的長度為1或者0。 將相鄰的子數(shù)組合并,形成更大的已排序的數(shù)組,直到最終得到一個完全排序的數(shù)組。 歸并排序的過程可以分為三

    2024年01月22日
    瀏覽(32)
  • 【初階算法4】——歸并排序的詳解,及其歸并排序的擴展

    【初階算法4】——歸并排序的詳解,及其歸并排序的擴展

    目錄 前言 學(xué)習(xí)目標: 學(xué)習(xí)內(nèi)容: 一、介紹歸并排序 1.1 歸并排序的思路 1.2 歸并排序的代碼 1.2.1 mergesort函數(shù)部分? 1.2.2 process函數(shù)部分? 1.2.3 merge函數(shù)部分? 二、AC兩道經(jīng)典的OJ題目 題目一:逆序?qū)栴} 題目二:小和問題? 三、練習(xí)一道LeetCode的題目 四、總結(jié)在什么情況下使

    2024年02月08日
    瀏覽(44)
  • 【排序算法】 歸并排序詳解!分治思想!

    【排序算法】 歸并排序詳解!分治思想!

    ?? 嶼小夏 : 個人主頁 ??個人專欄 : 算法—排序篇 ?? 莫道桑榆晚,為霞尚滿天! ? 什么是歸并?通過歸并排序就能讓數(shù)據(jù)有序?分治法是怎么在歸并排序上應(yīng)用的?本文將對歸并排序進行細致入微的講解,庖丁解牛般讓你徹底明白歸并排序! 歸并排序(MERGE-SORT)是建

    2024年02月08日
    瀏覽(21)
  • C++排序算法:歸并排序詳解

    C++排序算法:歸并排序詳解

    一、歸并排序 二、基本算法 ????????1、分離 ????????2、合并 ????????3、圖片講解 三、代碼實現(xiàn) ? ? ? ? 1、分離函數(shù) ? ? ? ? 2、合并函數(shù)? ? ? ? ? 3、完整代碼? ? ? ? ? 4、樣例 四、總結(jié) ???????? 歸并排序 (Merge Sort)是建立在歸并操作上的一種既有效又穩(wěn)

    2024年02月12日
    瀏覽(19)
  • 算法基礎(chǔ)(一)| 快速排序和歸并排序詳解

    算法基礎(chǔ)(一)| 快速排序和歸并排序詳解

    ?寫在前面的話:本系列文章旨在復(fù)習(xí)算法刷題中常用的基礎(chǔ)算法與數(shù)據(jù)結(jié)構(gòu),配以詳細的圖例解釋,總結(jié)相應(yīng)的代碼模板,同時結(jié)合例題以達到最佳的學(xué)習(xí)效果。本專欄面向算法零基礎(chǔ)但有一定的C++基礎(chǔ)的學(xué)習(xí)者。若C++基礎(chǔ)不牢固,可參考:10min快速回顧C++語法,進行語法

    2024年02月21日
    瀏覽(31)
  • 【排序算法】 歸并排序詳解!深入理解!思想+實現(xiàn)!

    【排序算法】 歸并排序詳解!深入理解!思想+實現(xiàn)!

    ?? 嶼小夏 : 個人主頁 ??個人專欄 : 算法—排序篇 ?? 莫道桑榆晚,為霞尚滿天! ? 什么是歸并?通過歸并排序就能讓數(shù)據(jù)有序?分治法是怎么在歸并排序上應(yīng)用的?本文將對歸并排序進行細致入微的講解,庖丁解牛般讓你徹底明白歸并排序! 歸并排序(MERGE-SORT)是建

    2024年02月08日
    瀏覽(24)
  • 【排序算法】 歸并排序詳解!深入理解!思想+源碼實現(xiàn)!

    【排序算法】 歸并排序詳解!深入理解!思想+源碼實現(xiàn)!

    ?? 嶼小夏 : 個人主頁 ??個人專欄 : 算法—排序篇 ?? 莫道桑榆晚,為霞尚滿天! ? 什么是歸并?通過歸并排序就能讓數(shù)據(jù)有序?分治法是怎么在歸并排序上應(yīng)用的?本文將對歸并排序進行細致入微的講解,庖丁解牛般讓你徹底明白歸并排序! 歸并排序(MERGE-SORT)是建

    2024年02月06日
    瀏覽(24)
  • 歸并排序的詳解!

    歸并排序的詳解!

    本文旨在講解歸并排序的實現(xiàn)(遞歸及非遞歸)搬好小板凳,干貨來了! ? 在介紹歸并排序之前,需要給大家介紹的是什么是歸并, 歸并操作,也叫歸并算法,指的是將兩個順序序列合并成一個順序序列的方法 ,相信不少小伙伴之前都做過合并兩個有序鏈表或者兩個有序數(shù)

    2024年02月10日
    瀏覽(22)
  • 【算法】歸并排序 詳解

    【算法】歸并排序 詳解

    排序: 排序,就是使一串記錄,按照其中的某個或某些的大小,遞增或遞減的排列起來的操作。 穩(wěn)定性: 假定在待排序的記錄序列中,存在多個具有相同的的記錄,若經(jīng)過排序,這些記錄的相對次序保持不變,即在原序列中, r[i] = r[j], 且 r[i] 在 r[j] 之前,而

    2024年02月09日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包