五分钟解决算法问题:快速排序(c++)

    首先要知道数组从大到小排列的充分必要条件:对于数组中任一个数,比它小的数在它左侧,比它大的数在右侧。那么我们只需将数组进行如下操作:

1.分解

    以a[p]为基准,将比它小的移在a[p]后面  ,比它大的都放在a[p]的后面的后面。

如下图:


    然后将比a[p]小的最后一个数与a[p]交换位置。


2.递归

    将比a[p]小的数用以上步骤排序。

    将比a[p]大的数用以上步骤排序。

用一个数组举例:

     

以上步骤可以分解为:

    1.以3为基准,将比3小的移在3后面  ,比3大的都放在3的后面的后面。

     2.将左半段按以上步骤排序。(递归。以2为基准后又以1为基准.......)

     2.将右半段按以上步骤排序。(递归。以6为基准后又以5或4,5或4为基准.......)


源代码:

3,7,2,6,5,4,8,1 为例:

#include<iostream>
#include<algorithm>
using namespace std;
int Partition(int a[],int p,int r){
	int i = p,j = r+1;
	int x = a[p];
	while(true){
		while(a[++i]<x&&i<r);//a[i]比3大 
		while(a[--j]>x);//a[j]比3小 
		if(i<j){
			swap(a[i],a[j]);
		}
		else{
			break;
		}
	}
	a[p] = a[j];
	a[j] = x;
	
	return j;
}
void quicksort(int a[],int p,int r){
	if(p<r){
	int q = Partition(a,p,r);
	quicksort(a,p,q-1);
	quicksort(a,q+1,r);
	}
}
int main(){
	int a[8] ={3,7,2,6,5,4,8,1};
	quicksort(a,0,7);
	cout<<a[0]<<a[1]<<a[2]<<a[3]<<a[4]<<a[5]<<a[6]<<a[7]<<endl;
	return 0;
}


输出结果:


猜你喜欢

转载自blog.csdn.net/tao_gis/article/details/80829024
今日推荐