gpt4 book ai didi

c# - 排序数组,使所有正数首先出现

转载 作者:行者123 更新时间:2023-11-30 13:38:54 25 4
gpt4 key购买 nike

我正在用 C# 编写代码对数组进行排序,我希望右侧的所有负值和左侧的所有正值不应该按降序排列

namespace SortApp
{
class Program
{
static void Main(string[] args)
{
int[] newInt = new int[] { 5, -2, -1, -4, -20, 6, 7, -14, 15, -16, 8, 9, 10 };
int size = 12, i= 0; // or newInt.Length

for (i = 0; i < newInt.Length; i++)
{
if (newInt[i] < 0 && newInt[size] > 0)
{
int temp = newInt[i];
newInt[i] = newInt[size];
newInt[size] = temp;
size--;
}
}
for (i = 0; i < newInt.Length; i++)
{
Console.Write(newInt[i]);
Console.Write(" ");
}
}
}
}

但输出是这样的(-20 在错误的一边):

5 10 9 8 -20 6 7 -14 15 -16 -4 -1 -2

但预期的输出是:

5 10 9 8 15 6 7 -14 -20 -16 -4 -1 -2 

为什么我的代码没有产生预期的输出?

最佳答案

您的解决方案错误地决定了何时结束循环。此外,它无条件地递增循环 header 中的 i,并且永远不会递减 size,即使它指向负数也是如此。

修复方法如下:

for (i = 0; i < size ; ) {
if (newInt[i] < 0 && newInt[size] >= 0) {
int temp = newInt[i];
newInt[i] = newInt[size];
newInt[size] = temp;
size--;
i++;
continue;
}
if (newInt[i] >= 0) {
i++;
}
if (newInt[size] < 0) {
size--;
}
}

这是一个demo on ideone .

您可以为您的 leftright 指针使用更易读的标识符来重写此循环,而不是使用 isize 。这将使您的算法在代码中看起来更“对称”,以识别其设计中的对称性:

int left = 0, right = newInt.Length-1;
while (left < right) {
if (newInt[left] < 0 && newInt[right] >= 0) {
int temp = newInt[left];
newInt[left] = newInt[right];
newInt[right] = temp;
right--;
left++;
continue;
}
if (newInt[left] >= 0) {
left++;
}
if (newInt[right] < 0) {
right--;
}
}

这里是 an ideone link to the alternative implementation .

关于c# - 排序数组,使所有正数首先出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14179294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com