当前位置: 代码迷 >> J2SE >> 数组 冒泡排序法输出异常,求修正
  详细解决方案

数组 冒泡排序法输出异常,求修正

热度:545   发布时间:2016-04-23 19:52:59.0
数组 冒泡排序法输出错误,求修正
本帖最后由 zhy934453950 于 2015-04-17 17:04:08 编辑
本来应该是0,1,2,3,4,5,6,7,8,9
结果输出了一串排错的顺序9,8,4,2,0,0,7,5,6,1
public class ShuZuMPpaixu 
{
public static void main(String[] args)
{
int arr[]={0,4,8,7,9,5,2,3,6,1};
arrprint(arr);
arrMPpaixu(arr);
arrprint(arr);
}
public static void arrprint(int[] arr)
{
for(int i=0;i<arr.length;i++)
{
if(i<arr.length-1)//不懂为何不是arr[i]!=arr.length?
System.out.print(arr[i]+",");
else
System.out.print(arr[i]);
}
System.out.println();
}

public static void arrMPpaixu(int[] arr)
{
for(int i=0;i<arr.length-1;i++)
{
for(int j=0;j<arr.length-i-1;j++)
{ if(arr[j]<arr[j+1])
{
XHTjiaohuan(arr,i,j);
}
}
}
}

public static void XHTjiaohuan(int[] arr,int a,int b)  // 独立出循环体内交换数据功能
{
arr[a]=arr[a]^arr[b];
arr[b]=arr[a]^arr[b];
arr[a]=arr[a]^arr[b];
}
------解决思路----------------------
public static void XHTjiaohuan(int[] arr,int a,int b)  // 独立出循环体内交换数据功能
{
arr[a]=arr[a]^arr[b];
arr[b]=arr[a]^arr[b];
arr[a]=arr[a]^arr[b];
}
这部分有问题。。。原谅我水平低为什么用异或的符号。。。
------解决思路----------------------
已修改,问题看注释
public class ShuZuMPpaixu {
public static void main(String[] args) {
int arr[] = { 0, 4, 8, 7, 9, 5, 2, 3, 6, 1 };
arrprint(arr);
arrMPpaixu(arr);
arrprint(arr);
}

public static void arrprint(int[] arr) {
for (int i = 0; i < arr.length; i++) {
// 数组中最后一个元素索引是arr.length-1,这里是除了最后一个元素以外其它元素后面都输出一个逗号,
//所以用i!=arr.length-1;也可以,但不能用i!=arr.length;
if (i < arr.length - 1)
System.out.print(arr[i] + ",");
else
System.out.print(arr[i]);
}
System.out.println();
}

public static void arrMPpaixu(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] < arr[j + 1]) {
XHTjiaohuan(arr, j, j+1);//你原来这里的参数传错了,应该传j和j+1,而不是i和j
}
}
}
}

public static void XHTjiaohuan(int[] arr, int a, int b) // 独立出循环体内交换数据功能
{
arr[a] = arr[a] ^ arr[b];
arr[b] = arr[a] ^ arr[b];
arr[a] = arr[a] ^ arr[b];
}
}

------解决思路----------------------

for (int i = 0; i < arr.length - 1; i++) {
    boolean isExchange = false;
    for (int j = 0; j < arr.length - i - 1; j++) {
        if (arr[j] < arr[j + 1]) {
            XHTjiaohuan(arr, j, j+1);//你原来这里的参数传错了,应该传j和j+1,而不是i和j
            isExchange = true;
        }
    }
    if(!isExchange) break;
}

增加一个判断,如果一趟排序中没有元素交换,证明已经排序成功,运气好的话,可以减少比较次数、提高效率。
  相关解决方案