前言
第一行包含兩個正整數(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的思路見下圖:
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é)果見下圖所示:
在【初階數(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 的思路見下圖:
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é)果見下圖所示:
方法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的思路見下圖:
//動態(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é)果見下圖所示:
總結(jié)
C語言還需要多練習(xí),不管自己寫的代碼是羅嗦了,還是太爛了,也必須要寫完,大膽實現(xiàn)自己的想法,實現(xiàn)題目要求,這是最重要的一步。
第二步就是多看看別人寫的代碼,學(xué)習(xí)別人的思路,記錄下來寫成博客,方便自己復(fù)習(xí)。文章來源:http://www.zghlxwxcb.cn/news/detail-433599.html
熟能生巧!文章來源地址http://www.zghlxwxcb.cn/news/detail-433599.html
到了這里,關(guān)于【C語言練習(xí)——合并兩個有序序列】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!