C/C++实现快速排序算法的思路及原理解析
快速排序算法是一种高效的排序算法,它的平均时间复杂度是 O(nlogn),最坏情况下的时间复杂度是 O(n^2)。快速排序算法的核心思想是分治法,通过不断将原问题分解成规模更小的子问题来实现排序。本文将详细讲解 C/C++ 实现快速排序算法的思路及原理解析,包括实现过程和两个示例说明。
快速排序算法实现原理
快速排序的实现过程如下:
- 选择一个基准数,一般选取数组中的第一个数。
- 从数组左边开始向右找比基准数大的数,从数组右边开始向左找比基准数小的数,交换这两个数的位置。
- 重复执行步骤 2,直到左边的数都比基准数小,右边的数都比基准数大,此时将数组划分成了两部分。
- 对左边的部分和右边的部分分别递归执行步骤 1-3,直到子数组的长度为 1。
快速排序算法实现步骤
1. 确定基准数
首先选择一个基准数,一般选取数组中的第一个数。在代码中,我们可以使用数组的下标来表示基准数:
int partition(int arr[], int low, int high)
{
int pivot = arr[low]; //基准数
int i = low, j = high;
while (i < j) {
while (i < j && arr[j] >= pivot) j--;
if (i < j) arr[i++] = arr[j];
while (i < j && arr[i] <= pivot) i++;
if (i < j) arr[j--] = arr[i];
}
arr[i] = pivot;
return i;
}
2. 划分数组
接下来我们从数组左边开始向右找比基准数大的数,从数组右边开始向左找比基准数小的数,交换这两个数的位置。在代码中,我们可以使用双指针法来实现:
int partition(int arr[], int low, int high)
{
int pivot = arr[low]; //基准数
int i = low, j = high;
while (i < j) {
while (i < j && arr[j] >= pivot) j--;
if (i < j) arr[i++] = arr[j];
while (i < j && arr[i] <= pivot) i++;
if (i < j) arr[j--] = arr[i];
}
arr[i] = pivot;
return i;
}
3. 递归排序
重复执行步骤 2,直到左边的数都比基准数小,右边的数都比基准数大,此时将数组划分成了两部分。对左边的部分和右边的部分分别递归执行步骤 1-3,直到子数组的长度为 1。在代码中,我们可以使用递归来实现:
void quickSort(int arr[], int low, int high)
{
if (low < high) {
int pivot = partition(arr, low, high); //划分数组
quickSort(arr, low, pivot - 1); //排序左半部分
quickSort(arr, pivot + 1, high); //排序右半部分
}
}
示例说明
示例一
现在有一个数组 {3, 5, 1, 4, 2, 6},请按照从小到大的顺序排序。根据快速排序算法的实现原理,我们可以先选择数组中的第一个数 3 作为基准数,然后从数组左边开始向右找比基准数大的数,从数组右边开始向左找比基准数小的数,将它们交换位置,最终得到如下数组:{2, 5, 1, 4, 3, 6}。然后,我们可以以第三个数 1 作为基准数,再次进行划分,最终得到如下数组:{1, 2, 3, 4, 5, 6},即为排好序的数组。
示例二
现在有一个数组 {10, 80, 30, 90, 40, 50, 70},请按照从小到大的顺序排序。根据快速排序算法的实现原理,我们可以先选择数组中的第一个数 10 作为基准数,然后从数组左边开始向右找比基准数大的数,从数组右边开始向左找比基准数小的数,将它们交换位置,最终得到如下数组:{50, 80, 30, 90, 40, 10, 70}。然后,我们可以以第六个数 10 作为基准数,再次进行划分,最终得到如下数组:{10, 30, 40, 50, 70, 80, 90},即为排好序的数组。
总结
本文详细讲解了 C/C++ 实现快速排序算法的思路及原理解析。快速排序算法的核心思想是分治法,通过不断将原问题分解成规模更小的子问题来实现排序。实现过程包括三个步骤:确定基准数、划分数组和递归排序。快速排序算法的时间复杂度为 O(nlogn),空间复杂度为 O(logn)。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C/C++实现快速排序算法的思路及原理解析 - Python技术站