首先,我们先了解一下怎么将两个有序数组合并?
对于int arr1[] = {2,6,8,9}; int arr2[] = {1,3,4,7};
算法实现:
- //将有序数组a[]和b[]合并到c[]中
- void MemeryArray(int a[], int n, int b[], int m, int c[])
- {
- int i, j, k;
- i = j = k = 0;
- while (i < n && j < m)
- {
- if (a[i] < b[j])
- c[k++] = a[i++];
- else
- c[k++] = b[j++];
- }
- while (i < n)
- c[k++] = a[i++];
- while (j < m)
- c[k++] = b[j++];
- }
如果对于数组int arr1 = {10,5,6,9,24,16}; int arr2 = {12,15,6,9,8,23 };
这个问题的解决,我们思路可以是这样。把arr1分割成arr1_right,arr1_left;arr2分割成arr2_right,arr2_left。
然后对arr1_right,arr1_left;arr2_right,arr2_left;进行归并排序。
代码实现:
#include<stdio.h>
//将两个数组归并,int a[],int b[];这里是两个数组。
void MemeryArray(int a[], int n, int b[], int m, int c[])
{
int i, j, k;
i = j = k = 0;
while (i < n && j < m)
{
if (a[i] < b[j])
c[k++] = a[i++];
else
c[k++] = b[j++];
}
while (i < n)
c[k++] = a[i++];
while (j < m)
c[k++] = b[j++];
}
//将有二个有序数列a[first...mid]和a[mid...last]合并。 这里是一个数组
void mergearray(int a[], int first, int mid, int last, int temp[])
{
int i = first, j = mid + 1;
int m = mid, n = last;
int k = 0;
while (i <= m && j <= n)
{
if (a[i] <= a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
while (i <= m)
temp[k++] = a[i++];
while (j <= n)
temp[k++] = a[j++];
for (i = 0; i < k; i++)
a[first + i] = temp[i];
}
void mergesort(int a[], int first, int last, int temp[])
{
if (first < last)
{
int mid = (first + last) / 2;
mergesort(a, first, mid, temp); //左边有序
mergesort(a, mid + 1, last, temp); //右边有序
mergearray(a, first, mid, last, temp); //再将二个有序数列合并
}
}
int main(){
int arr1[] = {2,6,8,9,4,5};
int arr2[] = {3,7,1,12,16,11};
int temp1[6];
int temp2[6];
int temp[12];
int mid;
int n = sizeof(arr1)/sizeof(int);
int m = sizeof(arr2)/sizeof(int);
mergesort(arr1,0,6,temp1);
mergesort(arr2,0,6,temp2);
for(int i = 0;i < 6 ;i++){
printf("%d\n",temp1[i]);
}
for(int i = 0;i < 6 ;i++){
printf("%d\n",temp2[i]);
}
MemeryArray(arr1,n,arr2,m, temp);
for(int i = 0;i < 12 ;i++){
printf("%d\n",temp[i]);
}
}