为什么 arrayone 和 array2 的输出不一样?

问题描述 投票:0回答:1
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int FindMid(int array[], int n) {
  int i;
  int m = 0;
  for (i = 0; i < n; i++) {
    if (i < n - 1 && array[i] > array[i + 1])
      m = i + 1;
  }
  return m;
}

void MySort(int array[], int n) {

  int i = 0;
  int l = 0;
  int t = FindMid(array, n);
  int m = t;
  int k = 0;
  int *temp = (int *)malloc(sizeof(int) * n * 2);

  for (i = 0; i < n; i++) {
    temp[i] = 0;
  }

  while (l < m && m < n) {
    if (array[l] <= array[m]) {
      temp[k++] = array[l++];
    } else {
      temp[k++] = array[m++];
    }
  }

  while (l < t) {
    temp[k++] = array[l++];
  }
  while (m < n) {
    temp[k++] = array[m++];
  }

  for (i = 0; i < n; i++) {
    array[i] = temp[i];
  }

  free(temp);
}

void print_ary(int *pa, int n) {
  int i;

  for (i = 0; i < n; i++) {
    printf("%d ", pa[i]);
  }
  printf("\n");
}

int main(void) {
  int arrayone[13] = {1, 6, 9, 16, 21, 2, 5, 11, 19, 25, 30, 33, 40};
  int arraytwo[13] = {1, 6, 9, 16, 21, 25, 30, 33, 40, 2, 5, 11, 19};
  int a = 13;
  MySort(arrayone, a);
  print_ary(arrayone, a);
  MySort(arraytwo, a);
  print_ary(arraytwo, a);

  return 0;
}

根据代码,arrayone 的输出和 arraytwo 的输出应该是相同的,但产生了不同的输出。第一次传递 while 语句时,m 的值应该保持添加状态,但似乎编译是在 m 的值初始化的情况下继续进行的。

while(m<n){temp[k++]=array[m++]}

我认为这就是问题所在。我该如何解决它?`

预期(我想要)

1 2 5 6 9 11 16 19 21 25 30 33 40
1 2 5 6 9 11 16 19 21 25 30 33 40

输出(实际)

1 2 5 6 9 11 16 19 21 2 5 11 19
1 2 5 6 9 11 16 19 21 25 30 33 40
while (m < n) {
  temp[k++] = array[m++];
}

// Instead of this code

for (i = 0; i < n; i++) {
  if (temp[k - 1] < array[i]) {
    while (k < n) {
      temp[k++] = array[k++];
    }
  }
}

我使用这段代码重新编译,结果是一样的。即使我想从 chatgpt 得到提示,它仍然给出相同的答案。

c algorithm sorting
1个回答
0
投票

TLDR:

更改此:

while (l < m && m < n) {

对此:

while (l < t && m < n) {

说明:

如果我正确地阅读了您的代码,您的 MySort 函数将采用一个具有两个递增序列的数组。然后将数组排序为统一的递增序列。

例如

(10,20,30, 1,11,21) => {1,10,11,20,21,30}

这是你的错误:

while (l < m && m < n) {
    if (array[l] <= array[m]) {
        temp[k++] = array[l++];
    }
    else {
        temp[k++] = array[m++];
    }
}

代码同时将

l
m
(指定的中点)进行比较,但也使用
m
作为数组右半部分的迭代索引。因此
m
在循环的某些序列上会递增,但
l<m
比较永远不会期望
m
发生变化。

您只需要比较

l < t
而不是
l < m
。见上文。

© www.soinside.com 2019 - 2024. All rights reserved.