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

【C語言練習(xí)——合并兩個有序序列】

這篇具有很好參考價值的文章主要介紹了【C語言練習(xí)——合并兩個有序序列】。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


前言

第一行包含兩個正整數(shù)n, m,用空格分隔; n表示第二行第一個升序序列中數(shù)字的個數(shù); m表示第三行第二個升序序列中數(shù)字的個數(shù)
第二行包含n個整數(shù),用空格分隔
第三行包含m個整數(shù),用空格分隔

輸出描述:

  • 輸出為一行,輸出長度為n+m的升序序列
  • 即長度為n的升序序列和長度為m的升序序列中的元素重新進(jìn)行升序序列排列合并
輸入:
5 6
1 3 5 7 9 
0 2 4 6 8 10
輸出:
0 1 2 3 4 5 6 7 8 9 10

1、方法1——先合并再冒泡排序

方法1 顯示利用數(shù)組開辟空間,再將兩個數(shù)組合并后,通過冒泡排序算法進(jìn)行排序:

  • 在C語言基礎(chǔ)階段中 【C語言基礎(chǔ)5——數(shù)組(1)】4、數(shù)組作為函數(shù)參數(shù) 已經(jīng)詳細(xì)學(xué)過冒泡排序算法了

  • 在C語言進(jìn)階階段中【C語言進(jìn)階11——字符和字符串函數(shù)及其模擬實現(xiàn)(2))7、內(nèi)存操作函數(shù)】 已經(jīng)詳細(xì)學(xué)過庫函數(shù)了

方法1的思路見下圖:

【C語言練習(xí)——合并兩個有序序列】

void bubble_sort(int* arr, int sz)
{
	//排序坐外面的大循環(huán)次數(shù)
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int flag = 1;//狀態(tài)機(jī)標(biāo)志位,代表數(shù)組本身元素就是從小到大排序的
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				flag = 0;//只要有一個地方需要排序,就置零
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
		if (1 == flag)
		{//第一輪排序結(jié)果都是1,說明沒有地方需要排序
			break;//直接跳出后面的循環(huán),不需要再排序了
		}
	}
}
int main()
{
	int m = 0;//數(shù)組a的個數(shù)
	int n = 0;//數(shù)組b的個數(shù)
	int i = 0;
	int j = 0;

	scanf("%d%d", &m, &n);
	int a[1000];
	int b[1000];

	//輸入第一個數(shù)組
	for (i = 0; i < m; i++)
	{
		scanf("%d", &a[i]);
	}

	//輸入第二個數(shù)組
	for (j = 0; j < n; j++)
	{
		scanf("%d", &b[j]);
	}
	memcpy(a+m, b, n*4);//利用了庫函數(shù)
	//可以將合并后的數(shù)組打印出來看看
	//for (int i = 0; i < m+n; i++)
	//{
	//	printf("%d ", a[i]);
	//}
	bubble_sort(a, m+n);//冒泡排序的函數(shù),
	i = 0;
	for (i = 0; i < m + n; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

結(jié)果見下圖所示:

【C語言練習(xí)——合并兩個有序序列】
在【初階數(shù)據(jù)結(jié)構(gòu)與算法 1】時間復(fù)雜度與空間復(fù)雜度(1)2.3.5 練習(xí)5 中,已經(jīng)詳細(xì)學(xué)習(xí)過冒泡算法的時間復(fù)雜度為 O(N^2)。

因此將在方法1 的基礎(chǔ)上進(jìn)行優(yōu)化。

2、方法2——數(shù)組元素一一比較

將兩個序列的元素一一比較,按順序直接打印出來。方法2 的思路見下圖

【C語言練習(xí)——合并兩個有序序列】

int main()
{
	int m = 0;//數(shù)組a的元素個數(shù)
	int n = 0;//數(shù)組b的元素個數(shù)
	int i = 0;
	int j = 0;
	scanf("%d%d", &m, &n);
	int a[1000];//定義數(shù)組a
	int b[1000];//定義數(shù)組a

	//輸入第一個數(shù)組
	for (i = 0; i < m; i++)
	{
		scanf("%d", &a[i]);
	}

	//輸入第二個數(shù)組
	for (j = 0; j < n; j++)
	{
		scanf("%d", &b[j]);
	}
	i = 0;//再次初始化
	j = 0;
	while (i < m && j < n)
	{
		if (a[i]<b[j])
		{
			printf("%d ", a[i]);
			i++;
		}
		else
		{
			printf("%d ", b[j]);
			j++;
		}
	}
	if (i==m)//此時數(shù)組a的值都已經(jīng)打印出來了
	{
		for(;  j< n; j++)//數(shù)組b剩下的元素想直接打印出來就行了
		{
			printf("%d ", b[j]);
		}
	}

	if (j == n)//此時數(shù)組b的值都已經(jīng)打印出來了
	{
		for (; i < m; i++)//數(shù)組a剩下的元素想直接打印出來就行了
		{
			printf("%d ", a[i]);
		}
	}
	return 0;

}

結(jié)果見下圖所示:

【C語言練習(xí)——合并兩個有序序列】
方法2的時間復(fù)雜度為 O(m+n).

3、方法3——動態(tài)內(nèi)存空間版

在C語言進(jìn)階階段 【C語言進(jìn)階13——動態(tài)內(nèi)存管理】 已經(jīng)學(xué)習(xí)了動態(tài)內(nèi)存開辟空間相比數(shù)組的優(yōu)勢了,方法3 利用動態(tài)內(nèi)存空間和庫函數(shù),開辟所需空間大小,不浪費空間

方法3的思路見下圖:

【C語言練習(xí)——合并兩個有序序列】

//動態(tài)內(nèi)存版
int main()
{
	int m = 0;//數(shù)組a的個數(shù)
	int n = 0;//shuzub的個數(shù)
	int i = 0;
	int j = 0;
	scanf("%d%d", &m, &n);
	
	int *pa = (int*)malloc((m + 1) * sizeof(int));//開辟有序序列合并的數(shù)組空間
	int *pb = (int*)malloc((n + 1) * sizeof(int));//開辟有序序列合并的數(shù)組空間
	if (pa == NULL)
	{
		perror("malloc: ");
		return;
	}
	if (pb == NULL)
	{
		perror("malloc: ");
		return;
	}
	//輸入第一個數(shù)組
	for (i = 0; i < m; i++)
	{
		scanf("%d", pa+i);
	}

	//輸入第二個數(shù)組
	for (j = 0; j < n; j++)
	{
		scanf("%d", pb+j);
	}
	i = 0;//再次初始化
	j = 0;
	
	while (i<m && j<n)
	{
		if (*(pa + i) < *(pb + j))
		{
			printf("%d ", *(pa + i));
			i++;
		}
		else
		{
			printf("%d ", *(pb + j));
			j++;
		}
	}
	if (i == m)//此時數(shù)組a的值都已經(jīng)打印出來了
	{
		for (; j < n; j++)//數(shù)組b剩下的元素想直接打印出來就行了
		{
			printf("%d ", *(pb + j));
		}
	}

	if (j == n)//此時數(shù)組b的值都已經(jīng)打印出來了
	{
		for (; i < m; i++)//數(shù)組a剩下的元素想直接打印出來就行了
		{
			printf("%d ", *(pa + i));
		}
	}
	
	free(pa);
	free(pb);
	pa = NULL;
	pb = NULL;
	return 0;
}

結(jié)果見下圖所示:

【C語言練習(xí)——合并兩個有序序列】


總結(jié)

C語言還需要多練習(xí),不管自己寫的代碼是羅嗦了,還是太爛了,也必須要寫完,大膽實現(xiàn)自己的想法,實現(xiàn)題目要求,這是最重要的一步。

第二步就是多看看別人寫的代碼,學(xué)習(xí)別人的思路,記錄下來寫成博客,方便自己復(fù)習(xí)。

熟能生巧!文章來源地址http://www.zghlxwxcb.cn/news/detail-433599.html

到了這里,關(guān)于【C語言練習(xí)——合并兩個有序序列】的文章就介紹完了。如果您還想了解更多內(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ìn)行投訴反饋,一經(jīng)查實,立即刪除!

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

相關(guān)文章

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包