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;
}本回答被提问者和网友采纳
相似回答