天天看点

紫书_第八章_高效算法设计_8.2.2——快速排序

其分为三个步骤:

1.划分问题:把数组的各个元素重排后分成左右两部分,左边始终小于key,右边大于key。

2.递归求解:把左右两部分分别排序。

3.合并问题:其不用合并,因为此时数组已经有序。

来看代码:

/*************************************************************************
	> File Name: 1166.cpp
	> Author:chudongfang 
	> Mail:[email protected] 
	> 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);
        //由于其已经有序,就不用再进行合并。
    }
}
           

继续阅读