c语言 将两个数组合并(一个升序,一个降序)再升序输出,新手,简单的 能看懂的

如题所述

  #include<stdio.h>#include<stdlib.h>
  //冒泡排序 升序
  void bubblesort_ascend(int* a, int len)
  {
   int i = 0;
   int j = 0;
   int temp = 0;
   int anyswap = 0;
   for(;i < len; ++i)
   {
   anyswap = 0;
   for( j = 0; j < len-1-i; ++j)
   {
   if(a[j] > a[j+1])
   {
   temp = a[j];
   a[j] = a[j+1];
   a[j+1] = temp;
   anyswap = 1;
   }
   }
   if(!anyswap)
   {
   break;
   }
   }
  }
  //直接选择排序 降序
  void sele_descend(int* a, int len)
  {
   int i = 0;
   int j = 0;
   int cur_max_index = 0;
   int cur_max = 0;
   int temp = 0;
   for(; i < len-1 ; ++i)
   {
   cur_max = a[i];
   cur_max_index = i;
   for(j = i+1; j<len; ++j)
   {
   if(a[j] > cur_max)
   {
   cur_max = a[j];
   cur_max_index = j;
   }
   }
   if(cur_max_index != i)
   {
   temp = a[cur_max_index];
   a[cur_max_index] = a[i];
   a[i] = temp;
   }
}

  }
  // 将升序后的a 和 降序后的b 合并到c,并且 结果为升序
  void combie_ascend(int* a, int len_a, int* b, int len_b,int*c, int len_c)
  {
   int cur_index_c = 0;
   int cur_index_a = 0;//a 为升序,最小的元素下标是0
int cur_index_b = len_b-1;//b 为降序,最小的元素是最后一个

   for(cur_index_c = 0; (cur_index_c<len_c) && (cur_index_a<len_a) && (cur_index_b >=0); ++cur_index_c) //防止a,b,c 溢出
   {
   if( a[cur_index_a] < b[cur_index_b]) // 如果当前b的元素比a的元素大,插入a的元素
   {
   c[cur_index_c] = a[cur_index_a];
   cur_index_a++;
   }
   else // 否则插入b的元素
   {
   c[cur_index_c] = b[cur_index_b];
   cur_index_b--;
   }
   }
   if(cur_index_c == len_c) // c溢出 返回
   return;
   else // c 无溢出, 检查a,b 其中一个有无剩余元素, 若都有 则不可能到达这里
   {
   for(;cur_index_c < len_c && cur_index_a < len_a; ++cur_index_c,++cur_index_a)
   {

c[cur_index_c] = a[cur_index_a];

}
for(;cur_index_c < len_c && cur_index_b >= 0; ++cur_index_c,--cur_index_b)
{
c[cur_index_c] = b[cur_index_b];
}

}
}
void show_array(int* a, int len)
{
int i= 0;
for(;i<len;++i)
printf("%d ",a[i]);
printf("\n");
}

int main()
{
int a[] = {3,23,34,5,2,67,4,7,23};
int b[] = {29,43,2,64,2321,6,457,4};

int c[1000] = {0};
int len_a = sizeof(a)/sizeof(a[0]);
int len_b = sizeof(b)/sizeof(b[0]);
int len_c = sizeof(c)/sizeof(c[0]);
int show_len_c;

bubblesort_ascend(a,len_a);
sele_descend(b,len_b);
show_array(a,len_a);
show_array(b,len_b);
combie_ascend(a,len_a,b,len_b,c,len_c);
show_len_c = ((len_a+len_b) < len_c) ?(len_a+len_b):len_c;
show_array(c,show_len_c);

system("pause");
return 0;
}



参考资料:两种排序方法,一个合并函数(考虑溢出情况),望采纳……

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-11-30
void Merge(int mergeArray[],int ascArray[],int n1,int descArray[],int n2)
{
int i = 0, j = n2 - 1, k = 0;
while(i < n1 && j >= 0)
{
if(ascArray[i] < descArray[j])
{
mergeArray[k] = ascArray[i];
i++;
}
else
{
mergeArray[k] = descArray[j];
j--;
}
k++;
}
while(i < n1)
{
mergeArray[k] = ascArray[i];
i++;
k++;
}
while(j >= 0)
{
mergeArray[k] = descArray[j];
j--;
k++;
}
}
第2个回答  2012-11-30
//输入第一行升序,输入第二行降序,然后升序输出
#include <stdio.h>
#include <string>
void ins(char *a,char *b,char *str)
{
unsigned i,j=0;
for(i=0;i<strlen(a);i++)
str[i]=a[i];
for(i=strlen(a);i<=strlen(a)+strlen(b)-1;i++)
{
str[i]=b[j];
j++;
}
str[strlen(a)+strlen(b)]='\0';
}
void print(char *a)
{
char *p=a;
char *q=a+strlen(a)-1;
while(p!=q)
{
if(*p>*q)
{
printf("%c",*q);
q--;
}
else
{
printf("%c",*p);
p++;
}
}
printf("%c",*p);
}
int main()
{
char str1[100];
char str2[100];
char str[200];
gets(str1);
gets(str2);
ins(str1,str2,str);
print(str);
return 0;
}本回答被提问者和网友采纳

...排列的数组和一个按降序排列的数组,按升序合并后放到其中一个数组中...
printf("%d ",c[k]);} return 0;}

c语言中的merge函数
\/\/ 使用自定义比较函数\/\/ 接下来,我们使用默认的升序比较合并两个数组:std::array ai1d = {1, 3, 4, 5}; \/\/ 升序排列std::list lsti1d;for (const auto &i : ai1d) { lsti1d.push_back(i);}std::array ai2d = {2, 6, 7, 8}; std::list lsti2d;for (const auto &i...

C语言 升序和降序合并,最后得个升序
int main(){ int a[]={2,5,9,16,22},b[]={27,25,11,4,3},c[10];int lena,lenb,i,ii,temp=0,j=0;lena=sizeof(a)\/sizeof(a[0]);lenb=sizeof(b)\/sizeof(b[0]);for(ii=lenb-1;ii>=0;ii--){ for(i=temp;i<lena;i++){ if(b[ii]>=a[i]){ c[j]=a[i];...

C语言排序问题(升序与降序两个输出)
printf(

我是C语言的初学者,我想知道有哪一些适合我做的数组题。请指教!_百度...
1、排序:将数组中元素按不同方法升序\/降序排列;2、查找:如找出数组中特定元素,求出数组中某元素的个数,求最大值最小值;3、计算:如方差,均方差,求数列的第n项,前n项和;4、修改:替换数组中的元素,如大小写字母转换,或者在特定位置添加\/删除元素;5、交换:交换数组中元素;6、合并:...

在C语言中,如何输出一组数的排列组合
printf("请输入连续自然数的个数:");scanf("%d",&k);int *list = (int *)malloc(k);for (int i = 0; i < k; i ++){ list[i] = i + 1;} \/\/ int list[] = {1, 2, 3, 4, 5};perm(list, 0, k-1);printf("total:%d\\n", n);return 0;}该程序的输入为一个...

c语言,输入n和n个整数,先升序再降序那然后绝对值排序,用图片里的方法...
for(i=0;i<n-1;i++) {k=i; for(j=i+1;j<n;j++) if(abs(a[j])>abs(a[k]))k=j; t=a[i];a[i]=a[k];a[k]=t; } printf("|||...\\n"); for(i=0;i<n;i++) printf("%d ",a[i]); printf("\\n"); } 本回答由提问者推荐 已赞过 已踩过< 你对这个回答的评价...

c语言数组的排序
h>#include #define elemType int \/*元素类型*\/#define LEN 100 \/*数组长度上限*\/#define ASC 0 \/*升序*\/#define DESC 1 \/*降序*\/\/*冒泡排序*\/\/*参数说明:*\/\/*elemType arr[]:排序目标数组*\/\/*int len:元素个数*\/\/*int order:排序方式;升序(由小到大):ASC;降序(由大到小)...

用C语言对一维数组排序,并输出原来的位置
h>#include<string.h>#define N 5int main(){int a[N],b[N],c[N],i,j,temp;for(i=0;i<N;i++){\/\/输入数组,并用b保存数组a的值 scanf("%d",&a[i]);b[i]=a[i];}for(i=0;i<N-1;i++)\/\/对a从大到小冒泡排序 for(j=0;j<N-i-1;j++)if(a[j]<a[j+1]){...

c语言 向有序数组中插入一个数,保持原顺序不变,将新数组输出
for(i=0;i<15;i++)\/\/这里i<16;改成i<15;因为插入前数组有15个元素 { if(m<=a[i])\/\/这里m<a[i]改成m<=a[i]{ for(j=14;j>=i;j--)a[j+1]=a[j];a[i]=m;break;\/\/这里加break;插入m后退出循环 } } for(i=0;i<16;i++){ if(n<=a[i])\/\/这里n<a[i]改成...

相似回答