其分为三个步骤:
1.划分问题:把数组的各个元素重排后分成左右两部分,左边始终小于key,右边大于key。
2.递归求解:把左右两部分分别排序。
3.合并问题:其不用合并,因为此时数组已经有序。
来看代码:
/*************************************************************************
> File Name: 1166.cpp
> Author:chudongfang
> Mail:1149669942@qq.com
> Created Time: 2016年06月15日 星期三 16时43分32秒
************************************************************************/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#define INF (1ll<<60)-1
using namespace std;
typedef long long ll;
void Q_sort(int a[],int n);
int main(int argc,char *argv[])
{
int a[100];
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
Q_sort(a,n);
for(int i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
void Q_sort(int a[],int n)
{
int key=a[0];//利用key进行划分
int i=0,j=n-1;
if(n<=1) return ;
else
{
while(i!=j)
{
for(;i<j;j--)
if(a[j]<key)
{
a[i]=a[j];
break;
}
for(;i<j;i++)
if(a[i]>key)
{
a[j]=a[i];
break;
}
if(i==j) a[i]=key;
}
Q_sort(a,i);//递归求解
Q_sort(a+i+1,n-i-1);
//由于其已经有序,就不用再进行合并。
}
}