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

其分为三个步骤:

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);
        //由于其已经有序,就不用再进行合并。
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值