在不使用数组的情况下对数字进行排序

时间:2014-03-28 18:50:09

标签: arrays sorting

我的作业需要做的是将正数的数字从低到高排序。

我可以用

  • 运营商
  • 整数/双打/浮标/字符
  • if / switch and loops

我无法使用

  • char array()
  • 字符串

4 个答案:

答案 0 :(得分:16)

这样就可以了!

int number = 52146729;
int sortedNumber = 0;
for (int i = 9; i >= 0; i--)
{
    int tmpNumber = number;
    while (tmpNumber > 0)
    {
        int digit = tmpNumber % 10;             
        if (digit == i)
        {
            sortedNumber *= 10;
            sortedNumber += digit;
        }
        tmpNumber /= 10;                
    }               
}
System.out.println(sortedNumber);

这是java btw。鉴于这种限制,这是非常有效的,O(n)。

答案 1 :(得分:0)

鉴于完全缺乏需求,不确定这会有所帮助,但如果我在生产代码中执行此操作,我会使用列表和LINQ OrderBy方法:

List<int> testList = new List<int> { 1, 5, 10, 4, 2 };
IEnumerable<int> orderedList = testList.OrderByDescending(x => x);

对于数字排序,您已经非常清楚“数组”是什么。你需要某种集合才能实现这一目标。我会再次使用一个列表:

List<int> digits = new List<int>();
int remainingNumber = 52146729;
while (remainingNumber > 0)
{
   digits.Add(remainingNumber % 10);
   remainingNumber /= 10;
}

IEnumerable<int> orderedDigits = testList.OrderByDescending(x => x);

这是有效的,因为x mod y返回x / y的余数。所以9%10回报9,19%10回报等等。然后你除以10除去一位数,然后重复直到你用完为止。然后我使用与以前相同的顺序功能。这种方法绝对不使用字符串,也不使用任何显式数组(List是引擎盖下的数组)。就像我说的那样,没有任何类型的集合来实现这一点将会非常难看。

打印出该列表很简单(如果您只需要打印输出):

foreach (int i in orderedDigits)
   Console.Write(i);

如果你需要一个实际的数字,这会有点困难,所以我现在就把它关掉。

答案 2 :(得分:0)

为什么不尝试使用树?

用两个孩子建造一棵树:左右。左边的孩子存储较少的数字,而右边的孩子则存储较高因此,您需要考虑具有两种可能选择的节点。第一个数字是树的根。下一个号码可以左右存储。

树已满后,您可以使用有序方法访问每个号码: 1-左读; 2-读父母; 3-阅读rigth。

检查出来:http://en.wikipedia.org/wiki/Tree_traversal

答案 3 :(得分:0)

做基数风格:

int count9
int count8
int count7
int count6
int count5
int count4
int count3
int count2
int count1
int count0

// loop over the number and fill in the counts. (either with characters or by using %10)

for (int i = 0; i < count9; i++)
    print "9"

// more for loops, etc, downto 8.

绝对不是生产代码,但这几乎是由赋值的约束排除的。

希望这有帮助!