递归算法之快速排序法

快速排序算法的所用的方法是左右扫描法:当拿到一排无序的数列时,快速排序采取的方法是先找一个枢轴(即一个中间值,当然这个值不一定刚好就是这组数的中值)采用左右交替扫描法进行排序。

左右交替扫描法是:首先从右往左扫描这组值,把每一个值都与枢轴比较,如果大于等于枢轴就继续向左扫描,一旦小于枢轴就把这个值和枢轴交换,因为产生交换,这时就要从左往右开始扫描了,如果值小于枢轴就继续往右扫描,一旦大于等于枢轴就把这个值和枢轴交换,产生交换后就又开始从右往左扫描继续刚才的步骤,直到两边扫描到同一个值时,这一轮就完成。

因为这是采用了递归思想,所以左右扫描法可能会要进行好几遍,以下是实现的代码

#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;
}

这短短的代码,里面确是蕴含着大大的智慧,对算法越来越感兴趣了,哈哈。如果对上面的代码有疑问欢迎提问,我很乐意解答。

    原文作者:递归算法
    原文地址: https://blog.csdn.net/fancy_track/article/details/80789324
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞