之前看到一个招聘,有一行醒目的要求:
“15分钟写不出快排的勿扰。”
吓得我赶紧回忆了一下快速排序。
下面开始说正题
快速排序作为排序算法之王,还是很有必要掌握一下的,不用被那繁琐的过程吓倒,其实本质还是比较简单的。
下面来介绍一种好写(背)的快速排序C++代码。
切分部分代码:
int partition(int arr[], int low, int high) {
int pivot = arr[low];
while (low < high) {
while (low < high && arr[high] >= pivot) high--;
swap(arr[low], arr[high]);
//swap包含在头文件<algorithm>中,当然用传统“t = a, a = b, b = t”的办法也可以。
while (low < high && arr[low] <= pivot) low++;
swap(arr[low], arr[high]);
}
return low;
}
主体代码:
void QSort(int arr[], int low, int high) {
if (low < high) {
int pivot = partition(arr, low, high);
QSort(arr, low, pivot - 1); //采用递归的方式对切分后的子数组排序
QSort(arr, pivot + 1, high);
}
}
其中,参数low和high表示的是数组元素的下标,分别代表待排序数组的最左端元素和最右端元素。
样例代码:
#include<iostream>
#include<algorithm>
#include<ctime>
using namespace std;
int main()
{
srand(time(0));
int a[100];
for (int i = 0; i != 100; i++)
a[i] = rand() % 1000;
//QSort(a, 0, 100)
//拳打下标越界,脚踢死循环。
QSort(a, 0, 99);
for (int i = 0; i != 100; i++) {
cout << a[i] << ' ';
if ((i + 1) % 10 == 0)
cout << endl;
}
return 0;
}
从不会快速排序到会,连说话都敢更大声了。