使用For循环手动排序数组 - Java

时间:2016-01-12 13:37:50

标签: java

我在使用for循环手动排序数组时遇到问题。它的工作原理除了第一个和最后一个数字。这是我的代码:

Scanner numInput = new Scanner(System.in);

int tempVar, num;
String numbersString;
int[] numbers = {4, 11, 13, 12, 17, 35, 15, 7, 19, 3, 45};

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

numbersString = Arrays.toString(numbers);

System.out.println(numbersString);

8 个答案:

答案 0 :(得分:1)

 public int[] sort(int[] arr) {

        int marker, i, temp;
        marker =0;
        i = 1;

        while (marker < arr.length - 1) {
            if (i == arr.length) {
                marker++;
                i = marker;
            }

            if (arr[marker] > arr[i]) {
                temp = arr[marker];
                arr[marker] = arr[i];
                arr[i] = temp;
            }

            i++;
        }

        return arr;
    }

答案 1 :(得分:1)

您必须将j的值初始化为i + 1

public static void main (String[] args)
{
    int[] array = {4,2,1,3,5,9,6,8,7};

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

答案 2 :(得分:0)

试试这个:

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

对于迭代和反向条件,你没有错误的第二个。

答案 3 :(得分:0)

您的代码中有一些错误。我做了一些修改,请看:

int tempVar, num;
String numbersString;
int[] numbers = {4, 11, 13, 12, 17, 35, 15, 7, 19, 3, 45};

for (int i = 0; i < numbers.length; i++) {
    for (int j = i; j < numbers.length; j++) {
        if (numbers[i] < numbers[j]) {
            tempVar = numbers[i];
            numbers[i] = numbers[j];
            numbers[j] = tempVar;
        }
    }
}

numbersString = Arrays.toString(numbers);

System.out.println(numbersString);

首先,我建议你在第二个循环中进行迭代,从 i (因为之前的项目我现在正在排序)。

其次,您必须在 i j 位置切换项目。

最后,由于你使用 &lt; 严格的比较器而你的循环中断,你必须去用户 numbers.length < / strong>而不是 numbers.length - 1

有关详细信息,请参阅buble sort algorithm

答案 4 :(得分:0)

我相信你愿意做的是选择排序? https://en.wikipedia.org/wiki/Selection_sort我看到的其他选项是冒泡排序,但我会尝试解释选择排序。

所以外部for循环的第一次迭代,使用i的那个,你使用内部for循环检查整个数组中的最小数字,使用j检查整数数组,并将最小数字放在数组中。在外部for循环的第二次迭代期间,您只会检查尚未检查的数字,这是通过最后一个数字的第二个数字。在第三次迭代期间,您将通过最后一个数字查看第三个数字,依此类推。以下是我调整代码的方法,我调整了内部for循环,所以每次迭代都会检查一个较小的子列表并调整你的if子句,以便找到最小的数字:

    int tempVar;
    String numbersString;
    int[] numbers = {4, 11, 13, 12, 17, 35, 15, 7, 19, 3, 45};

    for (int i = 0; i < numbers.length - 1; i++)
    {
        // each iteration i you would need to go over a smaller array, so you set j = i each time
        for(int j = i; j < numbers.length - 1; j++){
            // checking if numbers[i] is greater than numbers[j + 1] instead of smaller than
            if(numbers[i] > numbers[j + 1]){
                tempVar = numbers [j + 1];
                numbers [j + 1]= numbers [i];
                numbers [i] = tempVar;
            }
        }
    } 
    numbersString = Arrays.toString(numbers);
    System.out.println(numbersString);

答案 5 :(得分:0)

我将提供代码的修改版本,旨在解释您的代码无效的原因。 首先,我们需要具体决定我们想做什么。假设我们想要按 降序 顺序对数字进行排序。

这是什么意思?每当我们在 lowIndex highIndex 中比较两个值时,我们都要确保 lowIndex 的值高于atE的值 highIndex

您的代码存在的问题是,它无法跟踪哪个索引ij+1更低。

  • i==1j+1==2时,您的代码将交换这些值,以便将数字[1]和数字[2]中的最大值放在索引处1。
  • i==2j+1==1时,您的代码将交换这些值,以便将数字[1]和数字[2]中的最小值放在索引处1。

这是不存在的。该算法与自身竞争,试图在不同方向上移动值。如果我们修改你的代码以检查我们是否想要将大值交换到数组的开头或结束,你的算法将开始工作:

    for (int i = 0; i < numbers.length - 1; i++)
    {
      for(int j = 0; j < numbers.length - 1; j++)
      {
        if(numbers[i] < numbers[j + 1] && i < (j + 1)) //NOTE: additional condition for indices
        {
          tempVar = numbers [j + 1];
          numbers [j + 1]= numbers [i];
          numbers [i] = tempVar;
        }
      }
    } 

但请注意,上面的示例仅用于解释执行代码时出现的问题。与使用此代码不同,使用此问题的其他答案之一,或研究和比较sorting algorithms on wikipedia

可能更合适。

答案 6 :(得分:0)

试试这个

class desc
{

void printArray(int arr[], int n)
{
    for (int i = 0; i < n; i++)
    {
        System.out.print("  "+arr[i]);
    }
}
void sort(int arr[],int n)
{   
   for (int i = 1; i < n; i++) 
    {

        if(arr[i] < arr[i - 1] )
         {
            arr[i] = arr[i] + arr[i - 1];
            arr[i - 1] = arr[i] - arr[i - 1];
            arr[i] = arr[i] - arr[i - 1];
            i=0;

        }
    }

}


public static void main(String []args)throws Exception
{

   int[] arr = {-5, 0, -7, -2, -5, 1, -9, -1};
    int n = arr.length;
    desc d=new desc();
    d.sort(arr,n);
    d.printArray(arr, n);
  }
}

答案 7 :(得分:0)

for (int i = 0; i < numbers.length - 1; i++)
    {
      for(int j = 0; j < numbers.length - 1; j++)
      {
        if(numbers[i] < numbers[j ]) //NOTE: additional condition for indices
        {
          tempVar = numbers [j ];
          numbers [j ]= numbers [i];
          numbers [i] = tempVar;
        }
      }
    } 

使用它