【问题标题】:Manually Sorting an Array in Ascending Order手动按升序对数组进行排序
【发布时间】:2012-04-13 05:42:29
【问题描述】:

我有一个家庭作业,要按升序对数组进行排序。显然,这是手动完成的,不使用任何类型的sort() 函数。

我想这样做,我需要两个 for 循环:第一个循环将遍历现有数组并使用数组的值和索引创建一个临时值。第二个循环会将临时值与现有值进行比较并对它们进行排序。我一直在尝试编写代码,但我似乎无法正确编写代码。这是我想出的最新方法:

public int[] sortArray (int[] inArray)
{
    //Construct the array we're using here
    int[] newArray = inArray;

    for(int x = 0; x < a.length; x++) //a.length = # of indices in the array
    {
        int tempValue = a[x];
        int tempIndex = x;

        for(int y = 0; y < a.length; y++)
        {
            if(tempValue < a[y])
            {
                newArray[x] = tempValue;
            }
        }
    }

    return newArray;
}

我很确定这是不正确的,但如果有人能把我推向正确的方向,我将不胜感激!

【问题讨论】:

  • 可能值得您首先查看一些用于不同排序算法的伪代码:maven.smith.edu/~thiebaut/java/sort
  • 你应该使用某种排序算法吗?
  • 除非明确要求您考虑排序算法,否则我建议您找到一个简单的算法并在您的代码中实现它。而不是“非常确定”您的代码不正确,只需对其进行测试并找出答案。
  • 是的,算法一定是我自己的。 “很确定它不起作用”是指它不起作用,但我希望只需稍微修改代码即可使其正常工作,而不是从头开始。
  • 您使用变量a 无处可见。使用 inArray 代替它。创建新数组的正确方法是int[] newArray = new int[inArray.length];

标签: java arrays sorting


【解决方案1】:

您的Selection Sorter 几乎没有问题。你需要在x+1 开始你的y,而不是0。否则,您将重新扫描数组的排序部分。您还应该注意,选择排序是一种就地算法;如果您要创建数组的副本,则应使用Arrays.copy 方法,否则int[] newArray = inArray; 正在创建别名,而不是副本。最后,嵌套循环中的if 语句应该交换 a[x]a[y],而不是简单地将tempValue 放入:

if(newArray[x] < newArray [y]) {
    int tempValue = newArray[y];
    newArray[y] = newArray[x];
    newArray[x] = tempValue;
}

【讨论】:

  • 您能否详细说明一下交换部分?
  • 感谢Arrays.copy 的提示!我有点忽略了这一点,但事实证明这是我的问题:)
【解决方案2】:
int minval = input[0];
int temp=0;


for(int i = 0; i< input.length; i++)
{ 
    for(int j = 0; j< input.length-1; j++)
    {
        if(input[j+1]<input[j])
        {
            temp=input[j+1];
            input[j+1]=input[j];
            input[j]=temp;  
        }
    }
}

【讨论】:

    【解决方案3】:

    与其尝试发明自己的排序算法,我建议您研究一下已经存在的算法。在这方面有大量的现有技术。

    查看维基百科文章:Sorting algorithm

    Bubble sort 很容易实现,但具有二次复杂度(与您当前的尝试相同)。

    Quicksort 也不太难实现,并且具有更好的平均复杂度。

    【讨论】:

      【解决方案4】:

      您尝试实现的排序称为Bubble sort - 维基百科条目非常好,您应该阅读它。虽然,它从未真正使用过,因为有更好的选择 - Insertion sort(一个例子是 Python 中的 Timsort,它是合并排序和插入排序的混合体)。这两个是用两个循环来满足您的想法的基本算法,因此复杂度为 O(n2)。

      您还应该为您的作业考虑不同的算法,或者至少要注意:

      希望对你有帮助。

      【讨论】:

        【解决方案5】:
        int arr[] = new int[]{10, 20, 5, 6, 30, 1, 2};
            boolean bool = true;
            int t = 0;
            while (bool) {
                for (int i = 0; i < arr.length - 1; i++) {
                    if (arr[i] > arr[i + 1]) {
                        int c = arr[i];
        
                        arr[i] = arr[i + 1];
                        arr[i + 1] = c;
                        t++;
                    }
                }
                if (t == 0) {
                    bool = false;
                }
                t = 0;
            }
        
            for (int y : arr) {
                System.out.println(y);
            }
        

        【讨论】:

          【解决方案6】:
          int[] number = { 1,2,1,3,5,4 };
              int temp;
               for (int i = 0; i < number.length; i++)
                  {
                      for (int j = i + 1; j < number.length; j++)
                      {
                          if (number[i] > number[j])
                          {
                              temp =  number[i];
                              number[i] = number[j];
                              number[j] = temp;
                          }
                      }
                  }
          
                  for (int i = 0; i <number.length; ++i)
                      System.out.println(number[i]);
              }
          

          【讨论】:

          • 欢迎来到 Stack Overflow!尽管此代码可能有助于解决问题,但它并没有解释 why 和/或 如何 回答问题。提供这种额外的背景将显着提高其长期教育价值。请edit您的答案添加解释,包括适用的限制和假设。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多