我的Quicksort对于以下数组有什么问题?

时间:2018-06-08 03:41:25

标签: c# quicksort

我正在编写一个Quicksort算法而没有检查现有代码,我想出了以下代码:

public class QuicksortV7
{
    public void QuickSort(int[] arr, int start, int end)
    {
        int pivot = start;
        int left = start + 1;
        int right = end;

        while (left < right)
        {
            while (arr[left] <= arr[pivot] && left <= right) { left++; }
            while (arr[right] >= arr[pivot] && right >= left) { right--; }
            if (left >= right)
            {
                if (arr[pivot] > arr[right])
                {
                    int aux = arr[pivot];
                    arr[pivot] = arr[right];
                    arr[right] = aux;
                }

                QuickSort(arr, start, right - 1);
                QuickSort(arr, right + 1, end);
            }
            else
            {
                int aux = arr[left];
                arr[left] = arr[right];
                arr[right] = aux;
            }
        }
    }
}
    static void Main(string[] args)
    {
        int[] arr = new int[] { 69, 66, 92, 53, 11, 40, 59, 60, 17, 13, 53, 46, 30 };
        var quick = new QuicksortV7();
        quick.QuickSort(arr, 0, arr.Length - 1);
    }

似乎这不好,因为给定的数组示例失败了:

int[] arr = new int[] { 69, 66, 92, 53, 11, 40, 59, 60, 17, 13, 53, 46, 30 };

运行后的上述数组是:

11, 13, 30, 17, 40, 46, 53, 53, 59, 66, 60, 69, 92

我一直试图通过指令在纸质指令上进行测试,但我无法解决问题

欢迎任何提示,谢谢

2 个答案:

答案 0 :(得分:0)

我玩了你的代码并发现了一些问题。我在下面的评论中注意到它们。 我得到了你的示例输入。

public void QuickSort(int[] arr, int start, int end)
{
    int pivot = start;
    int left = start + 1;
    int right = end;

    while (left <= right)
    {
        while (arr[left] < arr[pivot] /*&& left <= right */) { left++; }
        while (arr[right] > arr[pivot] /*&& right >= left*/) { right--; }
        if (left <= right)
        {
            //if (arr[pivot] > arr[right]) // This if is not needed
            //{
                int aux = arr[left]; //Swap left and right, not pivot
                arr[left] = arr[right];
                arr[right] = aux;

                left++;
                right--;
           // }

            // This is done after the sorting loop
            //QuickSort(arr, start, right - 1); 
            //QuickSort(arr, right + 1, end);
        }
        //else
        //{
        //    int aux = arr[left];
        //    arr[left] = arr[right];
        //    arr[right] = aux;
        //}
    }

    // Do recursion after sorting loop is done
    if (start < right)
        QuickSort(arr, start, left);
    if (left < end)
        QuickSort(arr, left, end);
}

答案 1 :(得分:-2)

由于该算法是一种分而治之的分类技术。我通常喜欢将快速排序算法分成两个单独的方法。用于递归调用它的快速排序调用方法和用于拆分元素的分区方法。

您基本上试图将完整的递归排序算法塞入一个方法中。将从此示例中记下并再次尝试。

public void Quicksort(int[] array, int low, int high)
{
    int pivot = 0;
    if(high > low)
    {
        pivot = Partition(array, low, high);
        QuickSort(array, low, pivot - 1);
        QuickSort(array, pivot + 1, high);
    }
}

public static int Partition(int[] array, int low, int high)
{
    int left, right, piviot_item, = A[low];
    left = low;
    right = high;

    while(left < right)
    { 
        // move left while item < piviot
        while (array[left] < array[right])
        {
            left++;
        }

        while(array[right] > pivot_item)
        { 
            // move right while item > piviot
            right--;
        }

        if(left < right)
        {
            // swap the left and right item within the array
            swap(array, left, right)
        }

    }
    // final position of pivot
    array[low] = a[right];
}