快速排序
算法描述:
快速排序(Quick Sort)是一种常见的基于分治思想的高效排序算法,其核心思想是通过不断将待排序数据分割成独立的两部分,使得每个子序列都是有序的。具体来说,其排序过程如下:
- 选取一个基准值(pivot),一般是待排序区间的第一个元素。
- 通过一趟排序将待排序记录分成左右两个部分,其中左边部分的元素都小于等于基准值,右边部分的元素都大于基准值,且基准值在最终排好序的序列中已经就位。
- 对左右两个部分分别重复步骤 1 和步骤 2,直到整个序列有序。
算法演示
现在假设我们对[2, 5, 3, 7, 1, 8, 4, 10, 6, 9]这组数进行快速排序,选取第一个数2作为基准数。在这个序列中,将所有比基准数大的数放在2的右边,比基准数小的数放在2的左边.
在初始状态下,数字2在序列的第1位。我们的目标是将2挪到序列中间的某个位置,假设这个位置是k。现在就需要寻找这个k,并且以第k位为分界点,左边的数都小于等于2,右边的数都大于等于2。
第一步我们设定两个指针i和j分别指向数组的最左端和最右端.
第二步,先让j向左移动,找到第一个比基准值2小的数指向它,然后将i向右移动,找到比基准值2大的第一个数指向它。
找到i指向5,j指向1,然后交换它俩的位置
然后就可以得到[2,1,3,7,5,8,4,10,6,9]这一串数组,然后继续先向左移动j,找到比基准值小的第一个数指向1,这时发现i和j相遇了,本轮循环结束,让3与基准值2交换位置,i和j重新指向最左端和最右端。
到此,第一轮循环结束,得到的数组顺序为[1,2,3,7,5,8,4,10,6,9],可以发现第一轮基准值2的左边全是比它小的数,基准值的右边是比它大的数,由此可以分为左右两个数组,左边是[1],右边是[3,7,5,8,4,10,6,9]模拟第一轮循环,直到不可拆分出新的子序列为止。最终将会得到这样的序列,如下
左:[1],又右[3,7,5,8,4,10,6,9]
右边序列是以3为基准值排列得到的,然后继续以3为基准值,将数组分为左右两部分,再模拟上边循环可得到:
左边[1,2],右边[75,8,4,10,6,9]
继续模拟上边循环,右边以7为基准值,可得到:
左边[1,2,3,4,5,6],右边[10,8,9]
最后再以10为基准值,就可将整个数组排序完成
代码演示
以C++代码演示快速排序
#include <iostream>
#include <algorithm>
using namespace std;
void quickSort(int nums[], int start, int end) {
if (start >= end) return;
int i = start, j = end, base = nums[start];
while (i < j) {
while (i < j && nums[j] >= base) j--;
while (i < j && nums[i] <= base) i++;
if (i < j) swap(nums[i], nums[j]);
}
swap(nums[start], nums[i]);
quickSort(nums, start, j - 1);
quickSort(nums, j + 1, end);
}
int main() {
int nums[] = {11, 24, 5, 32, 50, 34, 54, 76};
int n = sizeof(nums) / sizeof(nums[0]);
cout << "快速排序前: ";
for (int i = 0; i < n; i++) {
cout << nums[i] << " ";
}
cout << endl;
quickSort(nums, 0, n - 1);
cout << "快速排序后: ";
for (int i = 0; i < n; i++) {
cout << nums[i] << " ";
}
cout << endl;
return 0; }
cout << nums[i] << " ";
}
cout << endl;
return 0;
}