白话经典算法系列之六 快速排序 快速搞定(转)

http://blog.csdn.net/morewindows/article/details/6684558

#include<iostream>
using namespace std;


/* 快速排序 挖坑填数+分而治之
 * s 数组 存放数字系列
 * l 左边初始基数下标
 * r 右边初始基数下标
****************************************/

// 返回调整后的基准数位置 挖坑天填数
int AdjustQrray(int s[], int l, int r)
{
    int i =l ;            //初始化,左右两边的坐标
    int j = r;
    int x = s[l];       //s[l] 是s[i]的第一个坑,作为基数

    while (i<j)
    {
        //从右向左找小于x的数来填s[i]
        while (i <j && s[j] >= x)
            j--;
        if (i < j)
        {
            s[i++] = s[j];    // 将s[j] 填到s[i] 中,s[j]就成了一个新的坑
        }

        //从左向右找大于或者等于x的数来填s[j]
        while (i <j && s[i] <x)
            i++;
        if (i <j)
        {
            s[j--] = s[i]; // 将s[i] 填到s[j]中,s[i]就形成一个新的坑
        }

    }
    // i =j 时,退出循环,此时将x填数最后一个坑中,
    //该数左边都是小于它的数,右边都是大于它的数
     s[i] = x;

     return i;  //返回改基数的下标位置

}

// 分而治之
void quick_sort1(int s[], int l, int r)
{
    if(l <r)
    {
        int i = AdjustQrray(s,l, r);   //先挖坑填数,调整s[];
        //for(i = 0;  i < 9; i++)
        //cout<< s[i] <<" ";

        quick_sort1(s,l,i-1);            //递归调用,排左边的
        quick_sort1(s,i+1,r);          //排右边的
    }


    return;
}


void quick_sort(int s[], int l, int r)
{
    int i;
    i = AdjustQrray(s, l, r);     //挖坑填数 找基数
    quick_sort1(s,l,i-1);            //递归调用,排左边的
    quick_sort1(s,i+1,r);          //排右边的

    return;
}


int main()
{
    int i;
    //int N =10;                                                    //数组个数
    int s[10] = {72,6,57,88,60,42,83,73,48,85};         //初始化
    for(i = 0;  i < 9; i++)
        cout<< s[i] <<" ";
    cout<<endl;
    //quick_sort(s, 0, 10-1);                                     //快速排序
    //AdjustQrray(s, 0, 10-1);
    //quick_sort1(s, 0, 10-1);
    quick_sort(s, 0, 10-1);                                     //快速排序
    //输出排序后的数组
    for(i = 0;  i < 9; i++)
        cout<< s[i] <<" ";

    return 0;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值