快速排序以第一个元素为枢轴并更改边

时间:2019-05-03 14:42:46

标签: c algorithm quicksort array-algorithms

我正在尝试在C中实现此版本的quicksort,但是我陷入了困境。以下是该算法的工作原理。这是我尝试实现的分区方案。代码如下。

17, -10, 7, 19, 21, 23, -13, 31, 59
 #   ^                           ^
start

17, -10, 7, 19, 21, 23, -13, 31, 59
 #           ^                    ^
move left pointer to first element larger than pivot. 3 compares

17, -10, 7, 19, 21, 23, -13, 31, 59
 #           ^           ^
move right pointer to first element smaller than pivot. 3 compares

17, -10, 7, -13, 21, 23, 19, 31, 59
 #           ^           ^
swap elements at pointer

17, -10, 7, -13, 21, 23, 19, 31, 59
 #                ^      ^
move left pointer to first element larger than pivot. 1 compare

17, -10, 7, -13, 21, 23, 19, 31, 59
 #               ^^      
move right pointer to first element smaller than pivot (but not past left     
pointer. 1 compare

-13, -10, 7, 17, 21, 23, 19, 31, 59
         #    

我正在尝试在代码中实现此版本的Quicksort,但是在实现它时遇到了麻烦。下面是我拥有的代码

int partition(int arr[], int low, int high)
{   
    int pivot = arr[low];
    int k = low;
    int j = high;

for (int i = low + 1; i < high; i++)
{
    if (pivot < arr[i]) // if the pivot is less than number go to left
    {
        for (j; j > i + 1; j--)
        {
           if (i >= j) 
             return j;

            if (pivot > arr[j])
            {
                swap(arr[i], arr[j]); // swap the two values
            }
        }
    }   
}

return 1;
}

void quickSort(int arr[], int low, int high) 
{ 
    if (low < high) 
    {             
        int pi = partition(arr, low, high); 


        quickSort(arr, low, pi); 
        quickSort(arr, pi + 1, high); 
    } 
} 

任何帮助将不胜感激。我有点困惑。谢谢。

1 个答案:

答案 0 :(得分:0)

很难通过示例运行来概括算法,尤其是您所展示的简单示例。您需要比示例提供的更高层次的视图,特别是对于分区功能。也许是这样的:

  1. 选择范围(arr[low])中最左边的元素作为枢轴元素
  2. 重复以下过程:
    • ij(包括两个端点)之间的索引low + 1high处找到一对元素,使得i <jarr[i]大于枢轴,而arr[j]小于或等于枢轴;如果没有这样的配对,请停止重复
    • 交换数组中的元素ij
  3. (可选,但建议使用)将数据透视图元素与最右边的元素交换,但不超过它。此元素的索引将与ij的最终值有关。
  4. 返回不超过枢轴的最右边元素的索引(如果选择实现(3),则在此处放置枢轴)。

在您认为您应该认识到的事情中,步骤(2)的迭代过程不是i的迭代-尽管它必须包含一个-因为每次迭代都只执行一次交换或停止迭代,通常,您不想为每个i执行一次交换。

还请注意,如果您在上述过程中确实实现了(3),则枢轴的最终最终位置实际上就是其正确位置,因此在递归时可以从两个子数组中忽略它。