两个整形数组的合并及排序

这里用的比较笨的方法但容易理解

先合并再排序

代码如下

 

#include <stdio.h>

#define N 100000

int combine(int a[],int b[],int c[],int m,int n)

{

 for(int i=0;i<m;i++)

  c[i]=a[i];

 for(int i=0;i<n;i++)

  c[m+i]=b[i];

 return m+n;

 

void fun(int c[],int n)

{

 int term;

 for(int i=0;i<n;i++)

 {

  for(int j=i+1;j<n;j++)

  {

   if(c[i]<c[j])

   {

    term=c[i];

    c[i]=c[j];

    c[j]=term;

   }

  }

 }

}

 

void PrintArr(int c[],int n)

{

 for(int i=0;i<n;i++)

  printf("%d ",c[i]);

}

 

int main()

{

 int a[N],b[N],c[N];

 int m,n,i,sum,x;

 scanf("%d",&m);

 for(i=0;i<m;i++)

  scanf("%d",&a[i]);

  

 scanf("%d",&n);

 for(i=0;i<n;i++)

  scanf("%d",&b[i]);

 sum=combine(a,b,c,m,n);//合并 

 fun(c,sum);//排序 

 PrintArr(c,sum);//打印 

 return 0;

 }

同样也可以拆分一个数组为两个,再合并

代码如下

int arr1[10],arr2[10];

int index1=0,index2=0;

for(int i=0;i<10; i++)

{

 if(a[i]%2!=0) arr1[index1++]=a[i];//奇数放入arr1这个数组 

 else arr2[index2++]=a[i];//偶数放入arr2这个数组 

}

 

int newarr[10];//申请一个新数组

for(int i=0; i < 5; i++)

 newarr[i]=arr1[i]; 

for(int i=0; i< 5; i++)

 newarr[i+5]=arr2[i];

无序整型数组的归并排序是将数组分成两个数组,分别对这两个数组进行归并排序,然后再将两个排好序的子数组合并成一个有序的数组。归并排序的步骤如下: 1. 将原数组分成两个数组,通过递归调用归并排序对这两个数组进行排序。 2. 当子数组只包含一个元素时,认为它已经排好序。 3. 合并两个排好序的子数组,创建一个临时数组来存储合并后的数组。 4. 比较两个数组的首个元素,将较小的元素放入临时数组,并将对应的指针向后移动。 5. 重复步骤4,直到有一个子数组的所有元素都被放入临时数组。 6. 将另一个子数组剩余的元素放入临时数组。 7. 将临时数组的元素复制回原数组的相应位置。 下面是一个用C语言实现归并排序的示例代码: ```c #include <stdio.h> void merge(int arr[], int l, int mid, int r) { int n1 = mid - l + 1; int n2 = r - mid; int L[n1], R[n2]; for (int i = 0; i < n1; i++) { L[i] = arr[l + i]; } for (int j = 0; j < n2; j++) { R[j] = arr[mid + 1 + j]; } int i = 0, j = 0, k = l; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } k++; } while (i < n1) { arr[k] = L[i]; i++; k++; } while (j < n2) { arr[k] = R[j]; j++; k++; } } void mergeSort(int arr[], int l, int r) { if (l < r) { int mid = l + (r - l) / 2; mergeSort(arr, l, mid); mergeSort(arr, mid + 1, r); merge(arr, l, mid, r); } } int main() { int arr[] = {5, 2, 8, 3, 1}; int n = sizeof(arr) / sizeof(arr[0]); mergeSort(arr, 0, n - 1); printf("排序后的数组:"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值