[英]Trouble bubble sorting (recursion) an array of integers in Java
尝试实现一种递归方法来对整数数组进行排序:
public static void bubbleSort(int[] arr, int n){
int index = n-1;
System.out.println("Round number: " + n);
System.out.println(Arrays.toString(arr));
while(index>=1)
{
if(arr[index] < arr[index-1])
swap(arr, index, index-1);
index--;
}
if(n>1)
bubbleSort(arr, n-1);
}
}
它似乎在前几轮中工作良好,将集合中的最小整数移到了前面,但是它只是在中途停止工作。 知道为什么吗? 谢谢!
您的算法每次都会将最小值移到数组的开头,然后忽略后续调用中的最后一个元素。 不幸的是,最后的元素并不能保证最大。
解决该问题的一种方法可能是将index
初始化为arr.length - 1
,并在index > arr.length - n
时继续循环。
将if
条件更改为:
...
if(arr[index] < arr[index-1]){
swap(arr, index, index-1);
index = n;
}
index--;
...
问题是,在找到要在整个阵列中“委派”的阵列成员之后,您需要“重新启动”,因为可能需要“重新考虑”其他成员。 使用调试器运行,看看我对我的描述不够清楚的意思。
完整解决方案:
import java.util.Arrays;
/**
* User: alfasin
* Date: 8/5/13
*/
public class BubbleSort {
public static void bubbleSort(int[] arr, int n){
int index = n-1;
System.out.println("Round number: " + n);
System.out.println(Arrays.toString(arr));
while(index>=1)
{
if(arr[index] < arr[index-1]){
swap(arr, index, index-1);
index = n;
}
index--;
}
if(n>1)
bubbleSort(arr, n-1);
}
private static void swap(int[] arr, int index, int i) {
arr[i] = arr[i] ^ arr[index];
arr[index] = arr[i] ^ arr[index];
arr[i] = arr[i] ^ arr[index];
}
public static void main(String...args){
int[] arr = {4,2,9,6,2,8,1};
bubbleSort(arr, arr.length);
for(int i=0; i<arr.length; i++){
System.out.print(arr[i]+" ");
}
}
}
就像sjee397建议的一样-这更像是气泡排序的“版本” ...
冒泡排序的一个更“保守”的版本:
public static void bubbleSort(int[] arr, int n){
boolean swapped= true;
while (swapped){
swapped = false;
for(int i=0; i<arr.length-1; i++){
if(arr[i]>arr[i+1]){
swap(arr,i,i+1);
swapped = true;
}
}
}
}
尝试这个:
import java.util.*;
public class Test{
public static void main(String[] args){
int[] ttt = {9,8,7,6,5,4,3,2,1};
bubbleSort(ttt, ttt.length);
}
public static void bubbleSort(int[] arr, int n){
int index = 0;
System.out.println("Round number: " + n);
System.out.println(Arrays.toString(arr));
while(index < n - 1){
if(arr[index] > arr[index + 1]){
swap(arr, index, index + 1);
}
index++;
}
if(n > 1){
bubbleSort(arr, n-1);
}
}
public static void swap(int[] arr, int i, int j){
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
就您在每一轮中的情况而言,您可以确保在每一轮结束时将最小的数字推入其位置,但随后忽略数组的最后一个元素,不一定是最大的数字。 您应该按相反的顺序进行操作,将最大的数字推到其位置,然后在下一轮中将其忽略。
http://en.wikipedia.org/wiki/File:Bubble-sort-example-300px.gif
仅供参考:冒泡排序的最坏情况是O(n ^ 2),也许您想实现更好的排序算法,例如快速排序或合并排序?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.