现在我发现自己处在一个特别令人困惑的地方。
我有一个元素数组 1 5 9(例如a1 a2 a3) 第二组元素 2 4 8(例如b1 b2 b3)
我希望输出为 1,2 5,4 9,8(即a1,b1 a2,b2 a3,b3) ...是否可能,我尝试排序的所有循环整个事情就像1,2,4,5,8,9 ???
提前致谢。
代码块:
void merge(int a[], int m, int b[], int n, int sorted[]) {
int i, j, k;
j = k = 0;
for (i = 0; i < m + n;) {
if (j < m && k < n) {
if (a[j] < b[k]) {
sorted[i] = a[j];
j++;
}
else {
sorted[i] = b[k];
k++;
}
i++;
}
else if (j == m) {
for (; i < m + n;) {
sorted[i] = b[k];
k++;
i++;
}
}
else {
for (; i < m + n;) {
sorted[i] = a[j];
j++;
i++;
}
}
}
}
答案 0 :(得分:7)
你的情况:
if (a[j] < b[k]) {
强制排序,但你说你不想要排序,所以不要这样做。
我更喜欢更简单的循环结构:
while (j < m && k < n)
{
sorted[i++] = a[j++];
sorted[i++] = b[k++];
}
while (j < m)
sorted[i++] = a[j++];
while (k < n)
sorted[i++] = b[k++];
这更像是惯用的C.
答案 1 :(得分:4)
试试这个......
int i,j,k,m;
int arr[] = {1,5,9};
int arr1[] = {2,4,8};
int l1 = sizeof(arr)/sizeof(int);
int l2 = sizeof(arr1)/sizeof(int);
int arr3[l1+l2];
int l3 = sizeof(arr3)/sizeof(int);
j=0;
k=0;
if(l1>=l2){
for(i=0;i<l1;){
if(arr[i]<arr1[j]){
arr3[k]=arr[i];
i++;
k++;
}else{
arr3[k]=arr1[j];
k++;
j++;
}
if(j==l2){
arr3[k]=arr[i];
i++;
k++;
}
}
}
for(i=0;i<l3;i++){
printf("%d ",arr3[i]);
}
<强>输出强>
1 2 4 5 8 9
答案 2 :(得分:3)
如果您想要这样的输出1,2 5,4 9,8
然后更改if
条件
if (j < m && k < n) {
sorted[i++] = a[j];
j++;
sorted[i++] = b[k];
k++;
}
答案 3 :(得分:3)
//int k = Math.Max(m, n);
int k = m < n ? n : m;
int j = 0;
for (int i = 0; i < k; i++)
{
if(i < m && i < n)
{
sorted[j++] = a[i];
sorted[j++] = b[i];
}
else
{
while(i < m)
{
sorted[j++] = a[i++];
}
while(i < n)
{
sorted[j++] = b[i++];
}
}
}