两个int数组拼接c语言,88.合并两个有序数组(LeetCode )——C语言

合并两个有序数组,根据题目的条件不同,细节处理也不同。我想先单纯的讨论下合并两个有序数组,不做时间及空间复杂度的限制。

只合并两个有序数组这里,只合并两个有序数组,不是完全在LeetCode88题的条件上解题,我只是想挖掘多一点的思路。在这里我只合并两个有序数组为一个有序数组,没有其他条件限制,后面将讨论LeetCode88题的解法。高手可略过。

有两种思路,一种是先合并数组,而不管它是否有序,然后将合并之后的数组排序。另一种思路是,在合并数组的过程中,对元素进行排序,合并结束,排序也结束,这种思路借鉴了归并排序的归并过程,即它用到了数组有序这个条件。

一、先将两个数组合并,然后再排序。

开辟一个新数组来存储这两个数组中的元素,需要O(m+n)的空间复杂度。将两个数组合并,此处不考虑这两个数组有序,因此合并数组时间花费为O(m+n),然后排序数组(各种排序都可),这里考虑想要较好的时间复杂度,因此用快速排序,时间复杂度为O((m+n)lg(m+n)),综合起来,最终的时间复杂度为O((m+n)lg(m+n)),空间复杂度O(m+n)。#include

#include

void exchange(int* x, int* y)

{

int temp = *x;

*x = *y;

*y = temp;

}

void mergeArr(int *arr, int len, int *arr1, int len1, int *arr2, int len2)

{

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

{

if (i < len1)

{

arr[i] = arr1[i];

}

else

{

arr[i] = arr2[i - len1];

}

}

}

// 快速排序是一种原址排序,不需要分配新的数组空间

// 只需要分配常量空间来存储主元以及用于数组元素交换

// start和end为子数组下标的起始位置与终止位置

// 快速排序的分割数组步骤,这是快速排序的核心

int partition(int *arr, int start, int end)

{

// 获取主元

int key = arr[end];

// left不存在,故将i取值为start-1

int i = start - 1;

for (int j = start; j < end; j++)

{

// 如果arr[j]小于主元,则将i递增,那么左边小于主元的数组的

// 长度增加了1,同时将arr[i]与arr[j]交换。

// 因为在i递增之后,指向的是一个大于主元的值

// 而arr[j]则是一个小于主元的值,因此交换他们的值,交换完成

// 则i及i之前的元素都是小于主元的值,i+1到j之间则是大于主元的值

// j到end-1之间是不确定大小的值,end即主元

if (arr[j] <= key)

{<

你可能感兴趣的:(两个int数组拼接c语言)