用C++实现快速排序
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法(Divide and Conquer),通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,然后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。 在C++中实现快速排序,首先我们需要理解算法的步骤: 1. **选择基准元素(Pivot Selection)**:在待排序的序列中选取一个元素作为基准,通常选择第一个或最后一个元素,但为了提高效率,可以随机选取。 2. **分区操作(Partitioning)**:将序列分为两个子序列,使得基准元素处于中间位置,所有小于基准的元素位于其左侧,所有大于基准的元素位于其右侧。这一步骤可以通过两个指针i(初始化为0)和j(初始化为序列长度-1)来实现,当i小于j时,比较元素arr[i]和arr[j],如果arr[i]大于基准则交换arr[i]和arr[j],然后i和j分别向中心移动,直到它们相遇。 3. **递归排序(Recursive Sorting)**:对左右两个子序列重复以上步骤,直到所有元素排序完毕。递归的终止条件是序列长度为1或0。 以下是一个简单的C++代码实现快速排序的例子: ```cpp #include <iostream> #include <vector> using namespace std; int partition(vector<int>& arr, int low, int high) { int pivot = arr[high]; int i = low - 1; for (int j = low; j <= high - 1; j++) { if (arr[j] < pivot) { i++; swap(arr[i], arr[j]); } } swap(arr[i + 1], arr[high]); return i + 1; } void quickSort(vector<int>& arr, int low, int high) { if (low < high) { int pi = partition(arr, low, high); quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } void printArray(vector<int>& arr) { int n = arr.size(); for (int i = 0; i < n; i++) cout << arr[i] << " "; cout << endl; } int main() { vector<int> arr = {10, 7, 8, 9, 1, 5}; int n = arr.size(); quickSort(arr, 0, n - 1); cout << "Sorted array: \n"; printArray(arr); return 0; } ``` 在这个例子中,`partition`函数实现了分区操作,`quickSort`函数是递归调用的主体。`main`函数中创建了一个整数数组并调用了快速排序函数,最后打印出排序后的结果。 至于纪录比较次数和移动次数,可以在`partition`和`quickSort`函数中增加计数器,每次元素交换时增加相应的计数。然而,这种方法可能并不精确,因为某些情况下元素可能会被多次交换。更准确的方法可能是跟踪每个元素的移动路径,但这会增加代码的复杂性。 快速排序的平均时间复杂度是O(n log n),最坏情况(即输入已排序或逆序)下是O(n^2),但这种情况在实际应用中很少发生,通过优化基准选取策略(例如三数取中法)可以进一步改善性能。空间复杂度为O(log n)由于递归调用栈的使用。 快速排序是一种高效且广泛使用的排序算法,适用于大规模数据处理。通过C++实现,我们可以直观地理解和掌握其核心逻辑,并能灵活应用于各种编程场景。