c語言合并兩個(gè)已排序數(shù)組的示例(c語言數(shù)組排序)
問題:將兩個(gè)已排序數(shù)組合并成一個(gè)排序數(shù)組
這里先不考慮大數(shù)據(jù)量的情況(在數(shù)據(jù)量很大時(shí)不知大家有什么好的思路或方法?),只做簡單數(shù)組的處理。
簡單代碼如下:
說明:之所以把merge函數(shù)定義成返回?cái)?shù)組長度,是因?yàn)楹罄m(xù)會有重復(fù)數(shù)據(jù)合并功能的merge版本,考慮到接口一致性。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int merge(int* ar1, int len1, int* ar2, int len2, int** rtn)
/*++
DeScription:
This routine merge two sorted arrays into one sorted array,
the same values in different arrays will be keeped.
Arguments:
ar1 - The first sorted array to be merged
len1 - The num of items in ar1
ar2 - The second sorted array to be merged
len2 - The num of items in ar2
rtn - The caller proviced pointer to get the result array,
memory allocated for rtn should be free by the caller.
Return Value:
The num of items in the merge array
--*/
{
int i=0,j=0,k=0;
int m=0;
int* res = NULL;
if (ar1 == NULL || ar2 == NULL || rtn == NULL) {
return 0;
}
*rtn = (int *)malloc((len1+len2)*sizeof(int));
if(*rtn == NULL) {
return 0;
}
memset(*rtn, 0, (len1+len2)*sizeof(int));
res = (int*)*rtn;
while(i<len1 && j<len2) {
if (ar1[i]<=ar2[j]) {
res[k++] = ar1[i++];
} else {
res[k++] = ar2[j++];
}
}
while(i<len1) {
res[k++] = ar1[i++];
}
while(j<len2) {
res[k++] = ar2[j++];
}
return len1+len2;
}
int merge_test()
{
int a1[] = {0,1,2,5,8,19,34,43,52};
int a2[] = {1,4,5,12,17,33,42,51,53,65,76};
int len1 = sizeof(a1)/sizeof(int);
int len2 = sizeof(a2)/sizeof(int);
int i = 0, len = 0;
int* a3 = NULL;
int* ptr = NULL;
len = merge(a1, len1, a2, len2, &a3);
if (a3 == NULL) {
printf("a3==NULL\n");
return 1;
}
ptr = a3;
while(i<len) {
printf("a3[%3d]---->%8d\n", i++, *ptr++);
}
if (a3 != NULL) {
free(a3);
}
return 0;
}
int main(int argc, char* argv[])
{
merge_test();
return 0;
}
相關(guān)文章
C++二叉樹的前序中序后序非遞歸實(shí)現(xiàn)方法詳細(xì)講解
前序遍歷的順序是根、左、右。任何一顆樹都可以認(rèn)為分為左路節(jié)點(diǎn),左路節(jié)點(diǎn)的右子樹。先訪問左路節(jié)點(diǎn),再來訪問左路節(jié)點(diǎn)的右子樹。把訪問左路節(jié)點(diǎn)的右子樹看成一個(gè)子問題,就可以完整遞歸訪問了2023-03-03C++ min/max_element 函數(shù)用法詳解
這篇文章主要介紹了C++ min/max_element 函數(shù)用法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02Matlab處理圖像后實(shí)現(xiàn)簡單的人臉檢測
本文主要介紹一下如何使用matlab進(jìn)行圖像處理后實(shí)現(xiàn)人臉檢測,感興趣的可以了解一下2021-11-11C語言typedef與復(fù)雜函數(shù)聲明問題的深入解析
以下是對C語言中的typedef與復(fù)雜函數(shù)聲明問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-07-07gazebo里通過節(jié)點(diǎn)發(fā)布topic讓關(guān)節(jié)轉(zhuǎn)動實(shí)現(xiàn)詳解
這篇文章主要介紹了gazebo里通過節(jié)點(diǎn)發(fā)布topic讓關(guān)節(jié)轉(zhuǎn)動實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12C++中幾種將整數(shù)轉(zhuǎn)換成二進(jìn)制輸出的方法總結(jié)
下面小編就為大家?guī)硪黄狢++中幾種將整數(shù)轉(zhuǎn)換成二進(jìn)制輸出的方法總結(jié)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09