奇数/偶数 - 排序数组

时间:2015-12-02 21:31:22

标签: c#

任何人都可以提供帮助。我必须编写一个程序,让用户输入10个数字。并以奇数(升序)和偶数(降序)对这些数字进行排序。

例如: 输入:2,8,7,13,23,9,34,11,1,16 输出:1,7,9,11,13,23,34,16,8,2

我必须在没有任何方法的情况下这样做,例如Array.Sort。

到目前为止,这是我的代码:

Console.WriteLine("Input 10 numbers: ");
        int[] number = new int[10];
        for (int i = 0; i < number.Length; i++) {
            number[i] = int.Parse(Console.ReadLine());

            if (number[i] == 0) {
                Console.WriteLine("input of 0 is not alllowed!");
                break;
            }
        }

        //EVEN NUMBERS
        for (int i = 0; i < number.Length; i++) {
            if (number[i] % 2 == 0) {
                Console.Write("{0} ", number[i]);
            }
        }

        //ODD NUMBERS
        for (int i = 0; i < number.Length; i++) {
            if (number[i] % 2 != 0) {
                Console.Write("{0} ", number[i]);
            }
        }

我只需要知道如何做到这一点。

6 个答案:

答案 0 :(得分:2)

您可以实现各种好的排序算法,我不会进入这个算法,因为这有点偏离您的问题主题,但是here's a link到描述其中许多算法的页面。

使用任何排序算法解决问题的关键是具有良好的比较功能,可以告诉您值应显示的顺序。在您的情况下,该比较的重要规则是: 奇怪应该永远在前 2.较低的奇数应该在较高的奇数之前 3.更高的偶数应该在低偶数之前

因此,您的比较函数可能类似于以下内容(注意:我不会以这种方式正常命名函数或参数,但这使得此示例更加清晰)

public bool AComesBeforeB(int a, int b) 
{
    if(IsOdd(a))
    {
        if(IsOdd(b))
        {
            return a < b;
        }
        else
        {
            return true;
        }
    }
    else
    {
        if(isOdd(b))
        {
            return false;
        }
        else
        {
            return a > b;
        }
    }
}

或者你可以像yyttr3推荐的那样做,并将偶数和奇数分成不同的数组,然后从那里排序。我不喜欢这样做,因为它需要更多的代码和更多的内存,但它基本上也是如此。

还有一些与您的问题没有直接关系的笔记:

  1. 如果有人输入0(提示,它没有正确运行),请查看会发生什么情况

  2. 根据您的代码和示例输入,您假设输入将始终是一系列整数,如果用户输入带小数的数字会发生什么?还是按字母顺序排列? (提示:异常会导致程序崩溃)

  3. 确保您的程序处理负数,因为它现在我不知道为什么它不会,但在处理数字输入时,这总是一个很好的测试

  4. 这看起来像是一项家庭作业,虽然可以就问题的具体部分寻求建议和帮助,但不要试图用SO为你做功课,要清楚我不认为你这样做,但Rariolu的答案基本上是给你代码批发,如果作为你自己的作品提交可以被认为是plagerism

  5. 当你说你想做这个&#34;没有任何方法&#34;时,就会误解对方法的误解。这段代码本身就是在一个方法中运行的,为了以清晰易懂的方式编写这段代码,你需要编写自己的方法,你可以从main方法调用它们。我认为你真正要说的是&#34;我不必使用通常用于排序的C#库方法&#34;。

答案 1 :(得分:0)

这应该有效:(请记住&#34;数字&#34;是一个包含所有数字的数组。

List<int> oddnumbers = new List<int>();
List<int> evennumbers = new List<int>();
foreach(int number in numbers)
{
    if(numer % 2 == 0)//If number is divisible by 2(is even)
    {
        evennumbers.Add(number);
    }
    else//If number is not divisible by 2(is odd)
    {
        oddnumbers.Add(number);
    }
}
evennumbers = evennumbers.Sort();
oddnumbers = oddnumbers.Sort();//Sort both lists so that they values are in ascending order.
evennumbers = evennumbers.Reverse();//Reverse the items in "evennumbers" into descending order.
List<int> newnumbersequence = new List<int>();
foreach(int number in oddnumbers)
{
    newnumbersequence.Add(number);
}
foreach(int number in evennumbers)
{
    newnumbersequence.Add(number);
}

然后将它们放在静态类

public static List<int> Sort(this List<int> numbers)
{
    int[] temp = numbers.ToArray();
    for(int i = 0; i < temp.Length-1; i++)
    {
        int index = i;
        while(index > -1)
        {
            if (temp[index] > temp[index+1])
            {
                int num1 = temp[index];
                int num2 = temp[index+1];
                temp[index] = num2;
                temp[index+1] = num1;
            }
        }
    }
    return temp.ToList();
}

public static List<int> Reverse(this List<int> numbers)
{
    List<int> returner = new List<int>();
    for(int i = numbers.Count-1; i > -1; i++)
    {
        returner.Add(numbers[i]);
    }
    return returner;
}

答案 2 :(得分:0)

在考虑如何实现此代码时,您应该遵循以下步骤:

  • 将数组拆分为两个数组,一个包含奇数,另一个包含偶数
  • 创建一个按升序对数组进行排序的方法
  • 使用此函数对两个数组进行排序,但颠倒偶数数组的顺序。

在伪代码中,它看起来与此相似:

//Array you get from the user
arr = get_user_inputs()
def split(array) :
  even = []
  odd  = []
  for item in array:
     if( item %2 == 0):
         even.append(item)
     else:
         odd.append(item)
  return (even,odd)

(even,odd) = split(arr)
(even,odd) = ( sort(even) , sort(odd) )
print(odd.toString + even.toString.reverse)

为了实现排序算法本身,我建议查找一些简单的排序算法,例如选择排序。

在youtube上有来自CS50的视频,解释了这个算法非常出色:

https://www.youtube.com/watch?v=f8hXR_Hvybo

答案 3 :(得分:0)

如果您输入一个字母,请检查您的输入是否会崩溃...

number [i] = int.Parse(Console.ReadLine());

您已成功检测到ODD / EVEN数字,但在打印之前需要将它们存储在中间数组中。

您有两种方法,

1

  1. 取最低的奇数,从输入列表中删除并添加到新列表中。
  2. 重复直到没有奇怪的数字
  3. 取最高偶数,从输入列表中删除并添加到新列表中。
  4. 重复直到没有偶数数字
  5. 打印新列表
  6. 2(与你所拥有的一起工作)

    1. 创建一个列表来存储奇数,一个用于偶数。
    2. 在您找到它们时将您的号码添加到相应的列表(奇数/偶数)(而不是像您当前所做的那样打印到控制台)。还要添加所需的订单。例如。对于列表长度,如果数字大于i处的项目,则插入i。
    3. 打印出两个列表

答案 4 :(得分:0)

我首先将数字拆分为两个列表(是的,我会使用列表而不是数组),然后创建一个方向的$_POST['VariableName'];函数。

https://en.wikipedia.org/wiki/Bubble_sort

如果该链接不足,您应该能够找到大量实施链接来帮助您。

答案 5 :(得分:0)

主要是伪代码,显示如何分解工作。

// initial conditions
evens = new List  // standard C# List<T> interface
odds = new List
i = 0;

// read numbers
while (i++ < 10) {
  filter(input);
}

print(odds, evens)

以下是&#34;工人&#34;功能:

// decide if it goes to the even or odd:
filter(input) {
  if(input % 2 == 0) {
     // sort descending
     sort(evens, input, "desc");
  } else {
     sort(odds, input, "asc");
  }
}

// given a list, a new input to add, and direction,
// the function mutates the list accordingly
sort(list, input, direction) {
  for(j = 0; j < list.length; j++) {
    item = list[j];
    if((direction == "desc" && item < input) 
       || (direction == "asc" && item > input))
    {
      list.insert(j, input);
      return
    }
  }
  list.add(input);  // lastly, if nothing else was triggered 

我认为最重要的缺失部分是排序算法。上面,我实现了insertion sort的变体,它使用List.insert方法作为移动&#34;数组&#34;的已经排序部分的快捷方式。