排序数字数组(第一个数字将被动态选择,其余数组应按升序排序)

时间:2015-10-15 10:38:16

标签: arrays algorithm sorting array-algorithms

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

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

3 个答案:

答案 0 :(得分:0)

这是一个简单的解决方案。 更改号码如果: - 另一个是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;
            }
        }
    }

答案 1 :(得分:0)

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

  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)中完成。
  3. 通常,第二点并不重要。如果是这样,你可能会处理一些不同的元素,然后使用像更好的时间强制性这样的​​东西也是一个好主意https://en.wikipedia.org/wiki/Counting_sort

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

    最后,您的输出为array.length - otherArray.lengthfirstNumber,后跟已排序的otherArray

    的内容

答案 2 :(得分:0)

根据您的号码大小,您可能需要计算每个号码的出现次数,并打印出您对其进行计数的次数。这是一个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)