c語言合并兩個(gè)已排序數(shù)組的示例(c語言數(shù)組排序)
問題:將兩個(gè)已排序數(shù)組合并成一個(gè)排序數(shù)組
這里先不考慮大數(shù)據(jù)量的情況(在數(shù)據(jù)量很大時(shí)不知大家有什么好的思路或方法?),只做簡單數(shù)組的處理。
簡單代碼如下:
說明:之所以把merge函數(shù)定義成返回?cái)?shù)組長度,是因?yàn)楹罄m(xù)會(huì)有重復(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++中Semaphore內(nèi)核對(duì)象用法實(shí)例
這篇文章主要介紹了C++中Semaphore內(nèi)核對(duì)象用法實(shí)例,有助于深入了解信號(hào)量(Semaphore)的基本用法,需要的朋友可以參考下2014-10-10
使用C++實(shí)現(xiàn)Range序列生成器的示例代碼
在C++編程中,經(jīng)常需要迭代一系列數(shù)字或其他可迭代對(duì)象,本文將使用C++來實(shí)現(xiàn)一個(gè)簡單的Range封裝,文中的示例代碼講解詳細(xì),感興趣的可以了解下2023-11-11
C++ map與set封裝實(shí)現(xiàn)過程講解
set set是一種關(guān)聯(lián)式容器,下面這篇文章主要給大家介紹了關(guān)于C++中map和set使用的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-03-03
VC判斷進(jìn)程是否具有administrator權(quán)限的方法
這篇文章主要介紹了VC判斷進(jìn)程是否具有administrator權(quán)限的方法,在Windows應(yīng)用程序設(shè)計(jì)中具有一定的實(shí)用價(jià)值,需要的朋友可以參考下2014-10-10
c/c++ 利用sscanf進(jìn)行數(shù)據(jù)拆分操作
這篇文章主要介紹了c/c++ 利用sscanf進(jìn)行數(shù)據(jù)拆分操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12

