快速排序算法的所用的方法是左右扫描法:当拿到一排无序的数列时,快速排序采取的方法是先找一个枢轴(即一个中间值,当然这个值不一定刚好就是这组数的中值)采用左右交替扫描法进行排序。
左右交替扫描法是:首先从右往左扫描这组值,把每一个值都与枢轴比较,如果大于等于枢轴就继续向左扫描,一旦小于枢轴就把这个值和枢轴交换,因为产生交换,这时就要从左往右开始扫描了,如果值小于枢轴就继续往右扫描,一旦大于等于枢轴就把这个值和枢轴交换,产生交换后就又开始从右往左扫描继续刚才的步骤,直到两边扫描到同一个值时,这一轮就完成。
因为这是采用了递归思想,所以左右扫描法可能会要进行好几遍,以下是实现的代码
#include<iostream>
using namespace std;
void quick_sort(int a[], int start, int end) {
if (start < end) {
int s = a[start];
int i = start;
int j = end;
//注意刚开始排序一定得从右向左查找才可以
while (i < j) {
//从右向左查找第一个小于s的值与a[0]交换
while (i < j && a[j] >= s)
j--;
if (i<j)
a[i++] = a[j];//把a[j]的值给a[i],并让i向后走一位
//从左向右查找第一个大于等于s的值与a[0]交换
while (i < j && a[i] < s)
i++;
if (i < j) {
a[j--] = a[i];//把a[i]的值给此时s所在的地址,并让j向前退一位
}
}
a[i] = s;//因为在之前的交换值过程中a[i]的值已经不是最初的值,所以要变回来
quick_sort(a, start, i - 1);//排序枢轴前数列
quick_sort(a, i + 1, end);//排序枢轴后数列
}
}
void put(int a[],int length) {
for (int i = 0; i < length; i++) {
cout << a[i]<<' ';
}
}
int main() {
int a[10] = { 10,9,8,7,6,5,4,3,2,1 };
cout << "排序前:";
put(a, 10);
quick_sort(a, 0, 9);
cout << "排序后:";
put(a, 10);
system("pause");
return 0;
}
这短短的代码,里面确是蕴含着大大的智慧,对算法越来越感兴趣了,哈哈。如果对上面的代码有疑问欢迎提问,我很乐意解答。