Quicksort分区算法循环不变量在分区方法中定义

时间:2012-12-01 15:15:43

标签: java quicksort

我在quicksort算法中实现了分区方法,但我不知道它是否满足它们给我的循环不变量。

    public class qs {
      private qs(){}

/**
 * Sort an array in ascending order
 * @param arr array to sor  */
   public static void quickSort(int[] arr){
    qs(arr, 0, arr.length);
        }

/**
         * Sort a region of an array in ascending order.
         * Elements outside the given region are unchanged.
         * requires: 0 <= start <= end <= arr.length
         * @param arr   array to sort
         * @param start start of region (inclusive)
         * @param end   end of region (exclusive)
         */
        private static void qs(int[] arr, int start, int end){
            if (end <= start+1){    //region of length 0 or 1
                return;
            }
            int x = arr[start];
            int p = partition(arr, start+1, end, x);
                //now swap arr[start] with arr[p-1]
            arr[start] = arr[p-1];
            arr[p-1] = x;
            qs(arr, start, p-1);
            qs(arr, p, end);



        }

        /**
         * Partition a region of an array.
         * Rearranges elements in region so that small ones
         *   all have smaller indexes than the big ones.
         * Elements outside the region are unchanged.
         * requires: 0 <= start <= end <= arr.length
         * @param arr   array to partition
         * @param start start of region (inclusive)
         * @param end   end of region (exclusive)
         * @param x     pivot - "small" and "big" are <x, >=x.
         * @return      start index (inclusive) of big elements
         *              in region after partition.
         */
        private static int partition(
            int[] arr, int start, int end, int x)
        {

            int l = start-1 ;
            int r = end;
            while (true) {
                while(++l< r && arr[l] < x);

                    while(r-- > l && arr[r] > x);// find smaller item

                    if(l >= r) // if pointers cross,
                        break; // partition done
                        else  {
                        int temp;
                    temp = arr[l];
                    arr[l] = arr[r];
                    arr[r] = temp;
                }
            }
            return l;
            }


        public static void main(String[] args) {
            int[] a = {15,8,4,8,9,6,4,1,2,5,6,4};
            quickSort(a);
            for (int i = 0; i < a.length; i++){
                System.out.print(" "+a[i]);
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

除了一个问题,您的代码应该可以运行。您正在选择的枢轴是数组的起点,而不是数组的中间点。所以改为分配

        int x = arr[start];

您最好将其分配给

        int x = arr[(start + end)/2];

您的代码必须有效。