【问题标题】:Remove negative numbers and sort an array删除负数并对数组进行排序
【发布时间】:2022-01-14 01:07:52
【问题描述】:

大家好,

我的任务是从数组中删除所有负数,并缩短它(返回新长度作为正数的数量)。我尝试通过 BubbleSort 右侧的所有负数来做到这一点,新长度将是(旧长度 - 交换数)。我的代码只是冻结了系统。

如果你们能提供帮助,我将不胜感激。

void swap(int *p, int *q) {
    int h = *p;
    *p = *q;
    *q = h;
}

int remove_negatives(int *array, int length) {
    int *a;
    int n = length;
    a = &array[n - 1];  
    for (int i = 0; i <= n - 1; i++) {
        while (array < a) {
            if (*array < 0) {
                swap(a, array);
                a--;
                array++;
                length--;
            }
        }
    }
    printialn(array, n);
    return length;
};

int main(void) {
    int a[] = {-1, 2, 4, -8, 3, 7, -8, 9, 3};
    int l = sizeof(a) / sizeof(a[0]);
    printiln(remove_negatives(a, l));
    return 0;
}

【问题讨论】:

  • 代码不完整。 printialnprintiln 是什么?

标签: c sorting


【解决方案1】:

while 循环永远不会停止,这可能是您的代码冻结的原因。 您的代码仅在 if 语句为真时更改地址。您的 main() 中的数组将卡在第二个 (a[1]) 元素上。所以如果我们在if语句为假的时候改变地址...

#include<stdio.h>
#include<stdlib.h>
void swap(int *p, int *q) {
    int h = *p;
    *p = *q;
    *q = h;
}

int remove_negatives(int *array, int length) {
    int *a, *head;
    int n = length;
    head = array;
    a = &array[n - 1];  
    for (int i = 0; i <= n - 1; i++) {
        while (array < a) {
            if (*array >= 0) {
                array++;
                continue;
            }
            swap(a, array);
            a--;
            array++;
            length--;
        }
    }
    for (int i=0; i<length; i++) {
        printf("%d ", *head);
        head++;
    }
    puts("");
    return length;
}

int main(void) {
    int a[] = {-1, 2, 4, -8, 3, 7, -8, 9, 3};
    int l = sizeof(a) / sizeof(a[0]);
    remove_negatives(a, l);
    return 0;
}

现在 while 循环可以工作了,但正如@wovano 所说,答案仍然是错误的。您的代码不完全是“冒泡排序”。您将所有负数交换到数组的末尾,实际上并没有对数组进行排序。

那么,让我们从头开始吧。

为简化流程,先让冒泡排序,再求新的数组长度。

#include<stdio.h>
#include<stdlib.h>
void swap(int *p, int *q) {
    int h = *p;
    *p = *q;
    *q = h;
}

int bubble_sort(int *array, int length) {
    int i, j;

    // Bubble sort
    for (i=0; i<length-1; i++) {
        for (j=i+1; j<length; j++) {
            if (array[i]<array[j]) swap(&array[i], &array[j]);
        }
    }

    // Find new array length
    for (i=length-1; i>=0; i--) {
        if (array[i]>=0) break;
        length--;
    }
    return length;
}

int main(void) {
    int a[] = {-1, 2, 4, -8, 3, 7, -8, 9, 3};
    int l = sizeof(a) / sizeof(a[0]);
    l = bubble_sort(a, l);
    for (int i=0; i<l; i++) printf("%d ", a[i]);
    puts("");

    return 0;
}

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
  • @wovano 我以为他只想知道程序为什么会死机,所以我只更改了那部分代码。我编辑了一个新的,打印出他想要的正确答案。
  • 顺便说一句,我认为 OP 不想对数组进行完全排序。我认为目的只是将所有负数移动到数组的一端,所以所有正数都在另一端。这需要 O(n),而冒泡排序需要 O(n^2) 时间。但不确定它是否与问题相关,因为我们不知道数组有多长以及时间是否是一个重要因素。此外,甚至可能不允许对数据进行排序:任务是从数组中删除所有负数
  • 我试图编辑他的问题,但他没有提供足够的信息,而且我认为他还没有在线阅读所有这些。但我还是想回答,这样他回来后就可以得到他需要的帮助。我也是新手。我认为回答与我的技能水平相匹配的其他人不想回答的问题是一种很好的练习方式。
  • 这不是 Stack Overflow 的目的。它不是个人支持或培训网站。其目的是为每个有关编程的问题建立详细、高质量的答案库(请参阅tour)。不应该回答不清楚或缺少可以唯一识别问题的具体细节的问题(请参阅how to answer)。您可以从这些问题中获得灵感,但我认为您不应该在此处发布您的代码作为答案。这些类型的问题和答案不会让网站变得更好。
猜你喜欢
  • 2014-04-29
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 2011-03-27
  • 2023-03-13
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多