手动按升序对数组进行排序

6
我有一个作业任务需要手动将数组按升序排序,显然,这需要使用两个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;
}

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

1
你可以先看一下不同排序算法的伪代码:http://maven.smith.edu/~thiebaut/java/sort/ - mbx-mbx
你应该使用特定的排序算法吗? - twain249
除非你被明确要求自己设计排序算法,否则我建议你找一个简单的算法并在代码中实现它。而不是“相当确定”你的代码是错误的,只需测试它并找出答案。 - alexis
是的,算法必须是我自己的。当我说“相当确定它不起作用”时,我的意思是它确实不起作用,但我希望只需稍微修改代码即可使其正常工作,而不是再次从头开始。 - Andrew De Forest
你使用了变量a,但它没有出现在任何地方。请使用inArray代替。创建新数组的正确方式是 int[] newArray = new int[inArray.length]; - Petr Janeček
抱歉,我只贴了一小段代码。 a是我要排序的原始数组。 - Andrew De Forest
6个回答

7
你有一个几乎可以的选择排序器版本。你需要将y0开始改为从x+1开始。否则,你会重新扫描数组的已排序部分。你还应该注意,选择排序是一种原地算法;如果你想要复制数组,你应该使用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;
}

你能稍微详细说明一下"swap(交换)"部分吗? - Andrew De Forest
谢谢你提供 Arrays.copy 的提示!我之前一直忽略了它,但事实证明这正是我的问题所在 :) - Andrew De Forest

2
代替尝试发明自己的排序算法,我建议你研究已经存在的内容。这方面有大量的先前技术可供参考。
请看维基百科文章:排序算法
冒泡排序(Bubble sort)非常容易实现,但具有二次复杂度(与您当前的尝试相同)。
快速排序(Quicksort)也不太难实现,并且平均复杂度更好。

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;  
        }
    }
}

1
你尝试实现的排序算法被称为 冒泡排序 - 维基百科条目很好,你应该阅读它。虽然它从未真正使用,因为有更好的选择 - 插入排序(例如Python中的Timsort是归并排序和插入排序的混合体)。 这两个都是适合你想法的基本算法,具有两个循环,因此O(n²)复杂度。

您还应考虑不同的算法来完成您的任务或至少了解:

希望有所帮助。


0
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);
    }

-1
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]);
    }

2
欢迎来到 Stack Overflow!虽然这段代码可能有助于解决问题,但它并没有解释为什么以及如何回答这个问题。提供这些额外的上下文信息会显著提高其长期教育价值。请[编辑]您的答案以添加说明,包括哪些限制和假设适用。 - Toby Speight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接