我的插入排序代码有什么问题?

时间:2013-11-29 18:12:03

标签: java sorting insertion-sort

我正在尝试在我的Android应用程序中实现此代码,加油站列表应按升序排序。 我应该实现另一种排序方法吗?     import java.util.ArrayList;

public class sortTest {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    ArrayList<Float> arr   = new ArrayList<Float> ();
    for (int i = 0 ; i <= 12 ; i++)
    {
    arr.add(i, (float) (((Math.random() * 90) + 10)/10)); // add random values to array 
    }

    ArrayList<String> listDataHeader = new ArrayList<String>();
    listDataHeader.add("Shell distance: "+ arr.get(0));
    listDataHeader.add("Esso  Distance:" +arr.get(1));
    listDataHeader.add("Tesco Distance "+arr.get(2));
    listDataHeader.add("Asda Distance "+arr.get(3));
    listDataHeader.add("BP Distance "+arr.get(4));
    listDataHeader.add("Texaco Distance "+arr.get(5));


    String temp;
    int f = listDataHeader.size();
    for(int i=0;i<f;i++){
      for(int j=i+1;j<f;j++){
        if(arr.get(i)>arr.get(j)){
          temp = listDataHeader.get(i);
          String x = listDataHeader.get(j);
          listDataHeader.set(i,listDataHeader.get(j));
          listDataHeader.set(j,temp);
         }
      }

    }
    for(String str:listDataHeader) //this list is list<String>
      {
      System.out.println(str);
      }

   }

}

2 个答案:

答案 0 :(得分:0)

嗯,这是冒泡排序,而不是插入排序。另外,你知道已经有Collections.sort()方法吗?

无论如何,它不起作用的原因是因为你有两个不同的列表你正在排序一个并在另一个上进行比较(你正在交换listDataHeader的元素,但你的测试继续列出arr)。

我的建议:只保留一个交换和比较列表:使用arr。对其进行排序后,将其格式化,添加加油站的名称并将其传递到另一个列表:listDataHeader

但是如果你想保持原样,你可以在交换arr的同时交换listDataHeader,这样就可以了。

需要更多工作的另一种解决方案:

您可以创建自己的Petrol类来实现Comparable接口。这个类可以包含两个元素:String带有汽油的名称,float是您要对其进行排序的随机值。

现在您可以创建List并将所有Petrol放入其中,然后拨打Collections.sort()  在该列表上它将起作用。

有很多关于如何实现Comparable的例子,甚至是“Java教程”中的一些例子。

很好的部分:如果你这样做,你将掌握有关如何扩展Java内容的知识。

答案 1 :(得分:0)

您的代码会进行一些不必要的调用(字符串x被分配但根本不使用),也不是插入排序。在这种情况下插入排序将是:

    int f = listDataHeader.size();
    for(int i=0; i<f; i++){    //first prediction: the smallest element in iteration is at "i".
        int prediction = i;
        for(int j=i+1; j<f; j++){
            if(arr.get(i) > arr.get(j)){    //found even smaller element - change prediction.
                prediction = j
            }
         }
         String temp = listDataHeader.get(i);
         listDataHeader.set(i, listDataHeader.get(prediction);
         listDataHeader.set(j, temp);
         arr.set(j, arr.get(i));            //for this to work you need to sort the array of
         arr.set(i, arr.get(prediction));   //values as well.

      }

您当前的算法正在进行冒泡排序而不是通常的方式(使用do-while循环)。你也可以通过检查是否预测来改进我写的代码!= i。如果没有,交换是没有必要的。阅读有关简单排序算法的更多信息。