QuickSort算法天真的实现..但为什么它不起作用?

时间:2013-02-11 10:08:12

标签: java

我是编程和java的新手所以请不要嘲笑这个:)。 now..i在网上查看了QuickSort算法的正确实现,我知道这一点。但我试图以我能想到的非常无辜的基本方式实现它。实际创建两个单独的数组(左,右)并继续对它们进行排序等等......

这是代码:

package excercise;

public class MyQuickSort {


    public static int list[] = {6,5,3,1,8,7,2,4};


    public static int[] addNumberToArray(int array[],int num){
        int newArray[] = new int[array.length+1];
        for(int i = 0;i<array.length;i++){
            newArray[i] = array[i];
        }
        newArray[newArray.length-1] = num;
        array = newArray;
        return array;
    }


    public static int[] partition(int arr[]){

        while(arr.length>1){
            int pivotIndex = (int)(arr.length/2);
            int left[] = new int[0];
            int right[] = new int[0];

            for(int i = 0;i<arr.length;i++){
                if(i==pivotIndex){
                    continue;
                }

                else if(arr[i]<=arr[pivotIndex]){
                    left = addNumberToArray(left,arr[i]);
                }
                else{
                    right = addNumberToArray(right,arr[i]);
                }
            }
            int origPivot = arr[pivotIndex];
            int k = 0;
            while(k<left.length){
                arr[k] = left[k];
                k++;
            }
            arr[k] = origPivot;
            k++;
            while(k<arr.length){
                arr[k] = right[k-(left.length+1)];
            }


            if(left.length>1){
            partition(left);
            }

            if(right.length>1){
            partition(right);
            }

        }

            return arr;
    }




    public static void main(String[]args){
            list = partition(list);
            for(int i = 0;i<list.length;i++){
                System.out.print(list[i]+" ");
            }

        }
    }

但为什么这会陷入循环并且不起作用?我不明白这个代码有什么问题。除了这个效率不高(至少可以说)!但我很固执,想要尝试让它工作无论如何..如果你有任何建议,那将是伟大的! thx提前

好吧,这是新的代码,在调试之后一切似乎工作正常,但是当我想打印新的排序的arr时,它仍然会打印出原始未排序的数组。递归将整个事物转回到它开始的地方。我怎么能让它“保存步骤”?我应该在哪里进行“回复”电话,我应该返回什么?

public class MyQuickSort {

    public static int list[] = {6,5,3,1,8,7,2,4};
    public static boolean sorted;
    public static int[] addNumberToArray(int arr[],int num){
        int newArr[] = new int[arr.length+1];
        for(int i = 0;i<arr.length;i++){
            newArr[i] = arr[i];
        }
        newArr[newArr.length-1] = num;
        arr = newArr;
        return arr;

    }


    public static void partition(int arr[]){

        while(!sorted){
            int pivotIndex = (int)(arr.length/2);
            int left[] = new int[0];
            int right[] = new int[0];

            for(int i = 0;i<arr.length;i++){
                if(i==pivotIndex){
                    continue;
                }
                else if(arr[i]<=arr[pivotIndex]){
                    left = addNumberToArray(left,arr[i]);
                }
                else{
                    right = addNumberToArray(right,arr[i]);
                }
            }
            int origPivot = arr[pivotIndex];
            int k = 0;
            while(k<left.length){
                arr[k] = left[k];
                k++;
            }
            arr[k] = origPivot;
            k++;
            while(k<arr.length){
                arr[k] = right[arr.length-arr.length-(left.length+1)+k];
                k++;
            }


            if(left.length>1){
                partition(left);
            }


            if(right.length>1){
                partition(right);
            }

            if(left.length<=1&&right.length<=1){
                sorted = true;

            }

        }



    }








    public static void main(String[] args) {
        partition(list);
        for(int i = 0;i<list.length;i++){
            System.out.print(list[i]+" ");
        }


    }

}

2 个答案:

答案 0 :(得分:1)

你的算法陷入了这个循环

while(k<arr.length){
    arr[k] = right[k-(left.length+1)];
}

原因是你没有增加你的k。

尝试

while(k<arr.length){
    arr[k] = right[k-(left.length+1)];
    k++;
}

答案 1 :(得分:1)

酷!你的实现似乎在逻辑上描绘了quicksort。但是,请注意,不使用其他缓冲区来实现快速排序。它应该在它自己的主数组中排序,递归调用只传递开始和结束边界。使用quicksort逻辑,您的实现更像是mergesort样式。是的,你错过了上述评论者所说的k ++。