我正在尝试为整数数组编写递归排序算法。以下代码打印到控制台:3,5,2,1,1,2,6,7,8,10,20
输出应该排序,但不知何故“它不起作用”。
public static void main(String[] args)
{
int[] unsortedList = {20, 3, 1, 2, 1, 2, 6, 8, 10, 5, 7};
duplexSelectionSort(unsortedList, 0, unsortedList.length-1);
for (int i = 0; i < unsortedList.length; i++)
{
System.out.println(unsortedList[i]);
}
}
public static void duplexSelectionSort(
int[] unsortedNumbers,
int startIndex,
int stopIndex)
{
int minimumIndex = 0;
int maximumIndex = 0;
if (startIndex < stopIndex)
{
int index = 0;
while (index <= stopIndex)
{
if (unsortedNumbers[index] < unsortedNumbers[minimumIndex])
{
minimumIndex = index;
}
if (unsortedNumbers[index] > unsortedNumbers[maximumIndex])
{
maximumIndex = index;
}
index++;
}
swapEdges(unsortedNumbers, startIndex, stopIndex, minimumIndex, maximumIndex);
duplexSelectionSort(unsortedNumbers, startIndex + 1, stopIndex - 1);
}
}
public static void swapEdges(
int[] listOfIntegers,
int startIndex,
int stopIndex,
int minimumIndex,
int maximumIndex)
{
if ((minimumIndex == stopIndex) && (maximumIndex == startIndex))
{
swap(listOfIntegers, startIndex, stopIndex);
}
else
{
if (maximumIndex == startIndex)
{
swap(listOfIntegers, maximumIndex, stopIndex);
swap(listOfIntegers, minimumIndex, startIndex);
}
else
{
swap(listOfIntegers, minimumIndex, startIndex);
swap(listOfIntegers, maximumIndex, stopIndex);
}
}
}
public static void swap(int[] listOfIntegers,
int index1,
int index2)
{
int savedElementAtIndex1 = listOfIntegers[index1];
listOfIntegers[index1] = listOfIntegers[index2];
listOfIntegers[index2] = savedElementAtIndex1;
}
答案 0 :(得分:2)
merge sort是一个众所周知的递归算法,你可以从中做出自己的递归排序算法:
public void mergeSort(int[] data) {
if(data.length <= 1) return; // Base case: just 1 elt
int[] a = new int[data.length / 2]; // Split array into two
int[] b = new int[data.length - a.length]; // halves, a and b
for(int i = 0; i < data.length; i++) {
if(i < a.length) a[i] = data[i];
else b[i - a.length] = data[i];
}
mergeSort(a); // Recursively sort first
mergeSort(b); // and second half.
int ai = 0; // Merge halves: ai, bi
int bi = 0; // track position in
while(ai + bi < data.length) { // in each half.
if(bi >= b.length || (ai < a.length && a[ai] < b[bi])) {
data[ai + bi] = a[ai]; // (copy element of first array over)
ai++;
} else {
data[ai + bi] = b[bi]; // (copy element of second array over)
bi++;
}
}
}
答案 1 :(得分:1)
您需要记住在递归方法中初始化变量时,您正在通过数组的stopIndex切片处理startIndex,而不是整个数组,并且您不应该触摸该切片之外的任何内容。
再看一下duplexSelectionSort方法中index,minimumIndex和maximumIndex的初始化。
答案 2 :(得分:0)
这是我试过的一种递归排序。希望这可以帮助。 与代码类似,但感觉有点复杂。
public static void main(String[] args)
{
int [] array = {5,9,2,3,10,20,1,7};
int len = array.length-1;
sort(array, 0, len);
for(int i=0;i<=len;i++)
{
System.out.println(array[i]);
}
}
public static void sort(int[] array, int start, int end)
{
if (start < end)
{
sort(array, start+1, end);
if(array[start]<=array[end])
{
sort(array, start, end-1);
}
else if(array[start]>array[end])
{
int temp = array[start];
array[start] = array[end];
array[end] = temp;
sort(array, start, end-1);
}
}
else if(start == end)
return;
}
答案 3 :(得分:0)
您也可以使用选择排序方法。
应用递归样式是一种很好的算法。
public static int FindMinIndex(int[] data, int x, int y){
int mini;
if(x==y){
mini=x;
}
else{
int tempmini=FindMinIndex(data, x+1, y);
if (data[tempmini]<data[x]){
mini=tempmini;
}
else{
mini=x;
}
}
return mini;
}
//Do selection sort between data[x]~data[y]
public static void SelectionSort(int[] data, int x, int y){
if (x==y){
return;
}
else{
int index=FindMinIndex(data, x, y);
int temp=data[index];
data[index]=data[x];
data[x]=temp;
SelectionSort(data,x+1,y);
}
}
答案 4 :(得分:-2)
要从最小的数组中对数组进行排序,请执行以下操作:
Arrays.sort(array);