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

排序算法8----歸并排序(非遞歸)(C)

這篇具有很好參考價(jià)值的文章主要介紹了排序算法8----歸并排序(非遞歸)(C)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

? ? ? ?1、介紹

? ? ? ? 歸并排序既可以是內(nèi)排序(在內(nèi)存上的數(shù)據(jù)排序),也可以是外排序(磁盤(pán)上)(硬盤(pán))(在文件中的數(shù)據(jù)排序)。

? ? ? ? 其他排序一般都是內(nèi)排序。

????????區(qū)別于快速排序的非遞歸,歸并排序非遞歸不適合使用棧。

? ? ? ? 因?yàn)榭焖倥判虻谋举|(zhì)是一種前序遞歸,而歸并排序的本質(zhì)是一種后序遞歸,并沒(méi)有“根”來(lái)區(qū)分左右。

? ? ? ? 那么歸并排序的非遞歸應(yīng)該怎么樣實(shí)現(xiàn)呢?

? ? ? ? 2、思想

? ? ? ? 我們先想想歸并的思想和目的:遞歸的分治是將數(shù)組分割成兩邊有序的子序列,然后再合并這兩個(gè)。那么我們是否可以直接將數(shù)組中兩兩元素歸并呢?答案是:對(duì)的!因?yàn)槲覀儗?shù)組中所有元素看作兩兩一組(每組數(shù)據(jù)中都各有一個(gè)元素),那么這一組中的兩個(gè)元素單個(gè)來(lái)看就是有序的子序列,然后合并這兩個(gè)元素。再往上就是四四一組(每組數(shù)據(jù)中都各有兩個(gè)有序的元素),八八一組........排序算法8----歸并排序(非遞歸)(C),排序算法,排序算法,c語(yǔ)言,算法

? ? ? ? 聽(tīng)起來(lái)好像很簡(jiǎn)單,其實(shí)坑很多,下面慢慢實(shí)現(xiàn)。

? ? ? ? 3、代碼

void MergeSortNonR_incline(int* arr, int n)
{
	int* tmp = (int*)malloc(sizeof(int) * n);
	if (tmp == NULL)
	{
		perror("malloc fail\n");
		exit(-1);
	}

	int gap = 1;//1-1歸
	//gap代表歸并每組數(shù)組個(gè)數(shù),即gap個(gè)和gap個(gè)歸并
	while (gap < n)
	{
		for (int i = 0; i < n; i += 2 * gap)//[0,n)
		{
			int begin1 = i, end1 = i + gap - 1;//第一組
			int begin2 = i + gap, end2 = i + 2 * gap - 1;//第二組
			//[begin1,end1],[begin2,end2] 歸并
			//[0,0]-[1,1]歸,[2,2]-[3,3],[4,4]-[5,5]....
			//[0,1]-[2,3]歸, [4,5]-[6,7]....
			//[0,3]-[4,7]歸, [8,11]-[11,15]......
			// ......
			//注意:begin1不會(huì)越界,end1,begin2,end2都可能越界,所以要修正
			if (end1 >= n || begin2>=n)
				break;
			if (end2 >= n)
				end2 = n - 1;

			//合并,將arr中對(duì)應(yīng)位置,放入tmp的對(duì)應(yīng)位置
			int j = begin1;
			while (begin1 <= end1 && begin2 <= end2)
			{

				if (arr[begin1] < arr[begin2])
					tmp[j++] = arr[begin1++];
				else
					tmp[j++] = arr[begin2++];
			}


			while (begin1 <= end1)
			{
				tmp[j++] = arr[begin1++];
			}
			while (begin2 <= end2)
			{
				tmp[j++] = arr[begin2++];
			}

			//[begin1,end1],[begin2,end2]
			memcpy(arr + i, tmp + i, sizeof(int) * (end2-i+1));//每次歸并完拷貝回去
		}
		gap *= 2;
	}

	free(tmp);
	tmp = NULL;
}

? ? ? ? 4、實(shí)現(xiàn)效果

	int arr[] = { 1,6,41,32,5,12,7,11 };
	int size = sizeof(arr) / sizeof(int);
	printf("原數(shù)組\n");
	for (int i = 0; i < size; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");

	printf("排序后\n");
	MergeSortNonR_incline(arr, size);
	for (int i = 0; i < size; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");

原數(shù)組:1 6 41 32 5 12 7 11

排序后:1 5 6 7 11 12 32 41文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-801445.html

到了這里,關(guān)于排序算法8----歸并排序(非遞歸)(C)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 八大排序算法之歸并排序(遞歸實(shí)現(xiàn)+非遞歸實(shí)現(xiàn))

    八大排序算法之歸并排序(遞歸實(shí)現(xiàn)+非遞歸實(shí)現(xiàn))

    目錄 一.歸并排序的基本思想 歸并排序算法思想(排升序?yàn)槔? 二.兩個(gè)有序子序列(同一個(gè)數(shù)組中)的歸并(排升序) 兩個(gè)有序序列歸并操作代碼: 三.歸并排序的遞歸實(shí)現(xiàn) 遞歸歸并排序的實(shí)現(xiàn):(后序遍歷遞歸) 遞歸函數(shù)抽象分析:? 四.非遞歸歸并排序的實(shí)現(xiàn) 1.非遞歸歸并排序算法思想

    2024年02月03日
    瀏覽(20)
  • 排序算法進(jìn)階——?dú)w并排序【詳細(xì)圖解,遞歸和非遞歸】

    排序算法進(jìn)階——?dú)w并排序【詳細(xì)圖解,遞歸和非遞歸】

    在了解歸并排序之前讓我們先了解一下歸并這一算法吧! 歸并算法一般應(yīng)用于合并兩個(gè)已經(jīng)有序的序列,使合并后的序列也有序,是一個(gè)時(shí)間復(fù)雜度為O(N)的算法,不過(guò)一般要借助兩個(gè)要排序的序列的元素個(gè)數(shù)個(gè)額外的空間。 一一一一一一一一一一一一一一一一一一一一一

    2024年01月24日
    瀏覽(22)
  • 排序算法之七:歸并排序(非遞歸)

    排序算法之七:歸并排序(非遞歸)

    我們之前學(xué)習(xí)了遞歸實(shí)現(xiàn)的歸并排序,是分治的思想,即先分解,再歸并 這篇文章我們講一下非遞歸的實(shí)現(xiàn) 非遞歸實(shí)現(xiàn)的思路是模擬遞歸的過(guò)程,在遞歸過(guò)程中,我們找key將數(shù)組分成左右數(shù)組,然后遞歸子數(shù)組,知道該數(shù)組剩一個(gè)元素,然后歸并:兩個(gè)兩元素?cái)?shù)組歸并為四

    2024年01月18日
    瀏覽(14)
  • 排序算法8----歸并排序(非遞歸)(C)

    排序算法8----歸并排序(非遞歸)(C)

    ? ? ? ? 歸并排序既可以是 內(nèi)排序 (在內(nèi)存上的數(shù)據(jù)排序),也可以是 外排序(磁盤(pán)上)(硬盤(pán)) (在文件中的數(shù)據(jù)排序)。 ? ? ? ? 其他排序一般都是內(nèi)排序。 ????????區(qū)別于快速排序的非遞歸,歸并排序非遞歸不適合使用棧。 ? ? ? ? 因?yàn)榭焖倥判虻谋举|(zhì)是一種

    2024年01月18日
    瀏覽(13)
  • 十大排序算法(中):冒泡排序,快速排序(遞歸和非遞歸)、歸并排序(遞歸和非遞歸)

    十大排序算法(中):冒泡排序,快速排序(遞歸和非遞歸)、歸并排序(遞歸和非遞歸)

    這篇文章,我們接著來(lái)講剩下的排序算法:冒泡排序,快速排序(遞歸和非遞歸)、歸并排序(遞歸和非遞歸) 中心思想: 交換就是指根據(jù)序列中的兩個(gè)元素的比較結(jié)果來(lái)對(duì)換這兩個(gè)元素在序列中的位置,特點(diǎn)就是:將值較大的元素向序列尾部移動(dòng),將值較小的元素向序列

    2024年02月05日
    瀏覽(16)
  • 排序篇:歸并排序的遞歸,非遞歸以及計(jì)數(shù)排序的實(shí)現(xiàn)(C語(yǔ)言)

    排序篇:歸并排序的遞歸,非遞歸以及計(jì)數(shù)排序的實(shí)現(xiàn)(C語(yǔ)言)

    目錄 一:歸并排序 (1)歸并排序的基本思想 (2)遞歸版本 ①實(shí)現(xiàn)思路 ②合并 ③遞歸實(shí)現(xiàn)有序 ④最終代碼 (3)非遞歸版本 ①實(shí)現(xiàn)思路 ②控制分組 ③最終代碼 (4)時(shí)間,空間復(fù)雜度分析 (5)小結(jié) 二:計(jì)數(shù)排序 (1)計(jì)數(shù)排序的基本思想 (2)實(shí)現(xiàn)思路 (3)圖解加最終代碼 (4)時(shí)間,空間復(fù)雜

    2024年02月04日
    瀏覽(12)
  • [排序算法]:歸并排序(Merge Sort)(遞歸與非遞歸實(shí)現(xiàn)詳解)

    [排序算法]:歸并排序(Merge Sort)(遞歸與非遞歸實(shí)現(xiàn)詳解)

    ????????歸并排序,是創(chuàng)建在歸并操作上的一種有效的排序算法。算法是采用分治法(Divide and Conquer)的一個(gè)非常典型的應(yīng)用,且各層分治遞歸可以同時(shí)進(jìn)行。歸并排序思路簡(jiǎn)單,速度僅次于快速排序,為穩(wěn)定排序算法,一般用于對(duì)總體無(wú)序,但是各子項(xiàng)相對(duì)有序的數(shù)列。

    2024年01月20日
    瀏覽(37)
  • 快速排序、希爾排序、歸并排序、堆排序、插入排序、冒泡排序、選擇排序(遞歸、非遞歸)C語(yǔ)言詳解

    快速排序、希爾排序、歸并排序、堆排序、插入排序、冒泡排序、選擇排序(遞歸、非遞歸)C語(yǔ)言詳解

    1.排序的概念及其運(yùn)用 1.1排序的概念 排序 :所謂排序,就是使一串記錄,按照其中的某個(gè)或某些的大小,遞增或遞減的排列起來(lái)的操作。 穩(wěn)定性 :假定在待排序的記錄序列中,存在多個(gè)具有相同的的記錄,若經(jīng)過(guò)排序,這些記錄的相對(duì)次序保持不變,即在原序

    2024年02月03日
    瀏覽(26)
  • 數(shù)據(jù)結(jié)構(gòu)排序——詳細(xì)講解歸并排序(c語(yǔ)言實(shí)現(xiàn)遞歸及非遞歸)

    數(shù)據(jù)結(jié)構(gòu)排序——詳細(xì)講解歸并排序(c語(yǔ)言實(shí)現(xiàn)遞歸及非遞歸)

    上次是快排和冒泡:數(shù)據(jù)結(jié)構(gòu)排序——詳解快排及其優(yōu)化和冒泡排序(c語(yǔ)言實(shí)現(xiàn)、附有圖片與動(dòng)圖示意) 今天為大家?guī)?lái)歸并排序 歸并排序是一種分治算法,它將序列分成兩個(gè)子序列,分別對(duì) 子序列進(jìn)行排序 ,然后將排序好的子序列 合并起來(lái) 。這個(gè)過(guò)程可以 遞歸 地進(jìn)行,

    2024年01月22日
    瀏覽(29)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】:非遞歸實(shí)現(xiàn)快速排序、歸并排序

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

    ?? 個(gè)人主頁(yè) : Quitecoder ?? 專(zhuān)欄 :數(shù)據(jù)結(jié)構(gòu)與算法 上篇文章我們?cè)敿?xì)講解了遞歸版本的快速排序,本篇我們來(lái)探究非遞歸實(shí)現(xiàn)快速排序和歸并排序 快速排序的非遞歸實(shí)現(xiàn)主要依賴(lài)于棧(stack)來(lái)模擬遞歸過(guò)程中的函數(shù)調(diào)用棧。遞歸版本的快速排序通過(guò)遞歸調(diào)用自身來(lái)處理子

    2024年03月24日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包