【问题标题】:Sort array of numbers (first number will be dynamically selected and remaining array should be sorted ascending)排序数字数组(第一个数字将被动态选择,其余数组应按升序排序)
【发布时间】:2015-10-15 10:38:16
【问题描述】:
int[] array = {1,1,0,1,2,2,0,0};
int  firstNumber = 1;// dynamic can be 0 or 1 or 2
int numberOfOccurances = 0;

//Basic sort functionality
for(int i = 0 ; i< array.length; ++i)
{
    if(array[i] == firstNumber)
    {
        numberOfOccurances++;
    }
    for(int j = i+1; j<array.length; ++j)
    {   
        if(array[j] < array[i])
        {   
            int temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        }
    }
}
int[] requiredArray= new int[array.length]; 
for(int i = array.length-1 ; i >= 0; i--)
{
    if(array[i] != firstNumber)
    requiredArray[i] = array[i];

}
for(int i =0;i<array.length;i++)
{
    if(i<numberOfOccurances)
    requiredArray[i]= firstNumber;
}

//Print Output
for (int i = 0; i<requiredArray.length; i++)
System.out.print(requiredArray[i] + "  ");

输出:1 1 1 1 0 0 2 2

我能够获得所需的输出,但我不确定这是否是解决我的问题的最佳方法?

【问题讨论】:

  • @svs 我正在尝试找出是否有更好的方法来解决它。
  • 不完全确定,但在codereview.stackexchange.com 询问这个问题不是更好吗?
  • @DmytroShevchenko 一般来说,这类问题(“代码有效,如何才能做得更好?”)对于 Stack Overflow 来说太宽泛了,但在 Code Review 中是欢迎的。

标签: arrays algorithm sorting array-algorithms


【解决方案1】:

这是一个简单的解决方案。 在以下情况下更改号码: - 另一个是 firstNumber - 另一个是次要的,不是第一个数字

    int[] array = {1,1,0,1,2,2,0,0,3,2,1,0,0,1,2,3,2,3};

    int firstNumber = 1, temp;

    for(int i=0;i<array.length-1;i++) {
        for(int j=i+1;j<array.length;j++) {

            if( (array[j] < array[i] && array[i]!=firstNumber) || array[j]==firstNumber) {
                temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
    }

【讨论】:

    【解决方案2】:

    有更好的方法。特别是,您的排序算法是

    1. 在复杂性上不是最优的 (O(n^2)),请参阅著名的排序算法以了解 O(n * log n) 替代方案(https://en.wikipedia.org/wiki/Sorting_algorithm 请参阅 MergeSort 和 QuickSort 了解流行的算法)。实际上,您的语言的标准库无论如何都会包含一个很好的实现。
    2. 仍在处理n 元素。如果你有很多“第一”,你实际上只需要m = n - number_of_first 元素,这可以在O(m * log m) 中完成。

    通常,第二点并不重要。如果是这样,您可能会处理一些不同的元素,然后使用类似的东西来获得更好的时间复杂性也是一个好主意https://en.wikipedia.org/wiki/Counting_sort

    忽略少数不同元素的情况,我建议您检查一次数组并将所有不是“firstNumber”的元素复制到另一个数组。然后使用标准排序算法对另一个数组进行排序 - 最好是内置算法。

    最后,你的输出是array.length - otherArray.length 乘以firstNumber 后跟排序后的otherArray 的内容

    【讨论】:

      【解决方案3】:

      根据您的数字大小,您可能希望计算一个数字的每次出现并打印出您计算的次数。这是一个 O(n) 算法。

      arrayToBeSorted = {collection of numbers}
      firstNumber = arrayToBeSorted[0]
      countArray = new int[max(arrayToBeSorted)]; //everything defaults to 0 in most languages
      for i:= 0 -> N
          countArray[arrayToBeSorted[i]]++;
      
      for i:= 0 ->countArray[firstNumber]
          print(firstNumber)
      
      for i: = 0 ->countArray.length
          if (i == firstNumber)
              continue;
          for j:= 0 -> countArray[i]
              print(i)
      

      【讨论】:

        猜你喜欢
        • 2015-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-25
        • 2017-02-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多