快速排序的基本思路

快速排序

快速排序的基本思路是: 通过一趟排序将待记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个有序的目的。

int Partiton(SqList *L, int low, int high)
{
    
       // 将每个枢轴值放入其排序后应该所在的位置
    int pivotkey = L->Array[low];  // 先将每个表的low作为枢轴值
    while (low < high)
    {
    
    
        while (low < high && L->Array[high] >= pivotkey)
            high--;  
        swap(L, low, high);  // 将比枢轴值小的交换到前边
        while (low < high && L->Array[low] <= pivotkey)
            low++;  
        swap(L, low, high);  // 将比枢轴值大的交换到后边
    }
    return low;  // 返回枢轴值,方便递归不含该位置的子表
}
void QSort(SqList *L,int low,int high)
{
    
    
    int pivot;
    if (low < high)
    {
    
    
        pivot = Partiton(L, low, high);  // 将数组不断一分为二,并且算出枢轴值
        QSort(L, low, pivot - 1);  // 对前半部分进行快速排序
        QSort(L, pivot + 1, high);  // 对后半部分进行快速排序
    }
}
void Quick_Sort(SqList *L)  // 快速排序的主函数
{
    
    
    QSort(L, 1, L->length);
}

对于代码中最明显的就是是递归,不过还有一个更重要的部分就是划分,不断的通过pivot将数组划分开来,同时将pivot的值分配到应该所在的位置。
在这里插入图片描述
得到第一层划分结束后,我们将5已经放入对应的位置,为了避免后面排序时对其干扰我们在代码上进行了避让

        QSort(L, low, pivot - 1);  // 对low到piovt-1的子列表划分
        QSort(L, pivot + 1, high);  // 对piovt+1到high的子列表划分

这里将数组列表划分为两个子列表,并对其分别进行递归划分,不断遍历后,直到划分为子序列中只有一个元素不能在划分时,我们也将数组排序完成了。

对于快速排序的基本思想就是这样,如果对本文有异议,还请指出其错误,欢迎各位指教​✌️​。

猜你喜欢

转载自blog.csdn.net/ananhenku/article/details/113483806