【问题标题】:Sorting : Bubble | Selection | Insertion : How to analyze time and space Complexity排序 : 气泡 |选择 |插入:如何分析时间和空间复杂度
【发布时间】:2015-07-28 14:56:27
【问题描述】:

我编写了以下程序(气泡、选择、插入),我想检查它们的时间和空间复杂度。谁能指导我它们是否正确,因为互联网/书籍上的大多数程序都使用数组而不是数组列表。


    public class BubbleSort {

      List<Integer> unsortedList;

      private BubbleSort() {
        unsortedList = new ArrayList<Integer>();
        unsortedList.add(0, 6);
        unsortedList.add(1, 3);
        unsortedList.add(2, 7);
        unsortedList.add(3, 4);
        unsortedList.add(4, 2);
        unsortedList.add(5, 3);
        unsortedList.add(6, 8);
    }

    private void sortData() {
        ArrayList<Integer> tempList = (ArrayList<Integer>) this.unsortedList;
        int size = unsortedList.size();
        int counter = size;
        do {

            for (int i = 0; i < size-1; i++) {

                if (unsortedList.get(i) > unsortedList.get(i + 1)) {


                    Integer temp1= unsortedList.get(i + 1);
                    Integer temp2= unsortedList.get(i);
                    unsortedList.set(i,temp1);
                    unsortedList.set(i+1,temp2);

                }
            }
            size = size - 1;
        } while (size != 1);
    }

    public static void main(String arg[]) {

        BubbleSort obj = new BubbleSort();
        obj.sortData();

        for(Integer i:obj.unsortedList){
            System.out.println(i);
        }
    }}

    public class SelectionSort {

    List<Integer> unsortedList;

    private SelectionSort() {
        unsortedList = new ArrayList<Integer>();
        unsortedList.add(0, 16);
        unsortedList.add(1, 3);
        unsortedList.add(2, 7);
        unsortedList.add(3, 4);
        unsortedList.add(4, 12);
        unsortedList.add(5, 3);
        unsortedList.add(6, 8);
        unsortedList.add(7, 18);
        unsortedList.add(8, 81);
        unsortedList.add(9, 2);
    }

    public void sortData() {

    int totalPass = unsortedList.size();
    int listLength = totalPass;

    for (int i = 0; i <= totalPass - 1; i++) {
        int pointerSmallPosition=i;
        for (int j = i; j < listLength-1; j++) {

            if (unsortedList.get(pointerSmallPosition) > unsortedList.get(j + 1)) {
                pointerSmallPosition=j + 1;
            }
        }

        int temp1= unsortedList.get(i);
        int temp2= unsortedList.get(pointerSmallPosition);
        unsortedList.set(i,temp2);
        unsortedList.set(pointerSmallPosition,temp1); 
    }

}

public static void main(String arg[]) {

    SelectionSort obj = new SelectionSort();
    obj.sortData();

    for (Integer i : obj.unsortedList) {
        System.out.println(i);
    }
}}

 public class InsertionSort {

    List<Integer> unsortedList;

    public InsertionSort(){
        unsortedList = new ArrayList<Integer>();
        unsortedList.add(0, 6);
        unsortedList.add(1, 3);
        unsortedList.add(2, 7);
        unsortedList.add(3, 4);
        unsortedList.add(4, 2);
        unsortedList.add(5, 3);
        unsortedList.add(6, 8);
    }

    public static void main(String arg[]){

        InsertionSort obj=new InsertionSort();
        obj.sortData();

        for(Integer i:obj.unsortedList){
            System.out.println(i);
        }

    }

    private void sortData() {

        int size = unsortedList.size();
        int sortedSize=0;
        for(int i=1;i<size-1;i++){
            int j=i;
            do{
                if(unsortedList.get(j)<unsortedList.get(j-1)){
                    int small=unsortedList.get(j);
                    int large=unsortedList.get(j-1);
                    unsortedList.set(j-1, small);
                    unsortedList.set(j, large);
                }
                j--;
            }while(j>sortedSize);

        }}}

【问题讨论】:

  • 这些是标准算法,时间和空间已被渐近评估:en.wikipedia.org/wiki/Introduction_to_Algorithms 如果你想测量你的速度,请使用stackoverflow.com/questions/351565/…,但在不同的机器上会有所不同。您应该使用大型列表(许多项目)来获得或多或少有意义的结果。我希望 Collections.sort 可能会有所帮助,因为它实现了优化的算法
  • 感谢您的快速回答
  • 让我们询问您的代码是否正确是题外话。如果你想知道时间复杂度,你应该坚持每个问题一个代码示例。也许您应该尝试更深入地了解 ArrayLists - 如果您知道数组的时间复杂度,并且您了解 ArrayLists,那么您应该能够很容易地弄清楚 ArrayLists 的复杂性(它通常完全相同,尽管有是使用 ArrayLists 以更简单但效率较低的方式做事的机会)。
  • 由于 get/set 方法的访问时间为 O(n),它们都是 O(n^3)。
  • 是的,我明白了使用集合和数组的目的,集合的成本远不止数组。不是一个好问题继续下去。

标签: java algorithm


【解决方案1】:

要分析复杂性,您可以使用Big O notation。我将您链接到一个可以帮助您理解其理论的表格。在 Big O 中使用 ArrayList 并不重要。你只需要“关心你的算法的主要过程”。在您的示例中,循环定义了 N 或 N^x ...

如果您想查看算法完成的时间,可以使用Antonio said 的帖子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 2018-05-09
    • 2019-10-19
    • 2011-09-01
    • 2013-11-18
    • 2015-06-15
    • 2012-11-23
    相关资源
    最近更新 更多