快速排序
快速排序的基本思路是: 通过一趟排序将待记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个有序的目的。
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的子列表划分
这里将数组列表划分为两个子列表,并对其分别进行递归划分,不断遍历后,直到划分为子序列中只有一个元素不能在划分时,我们也将数组排序完成了。
对于快速排序的基本思想就是这样,如果对本文有异议,还请指出其错误,欢迎各位指教✌️。