算法 -- 快速排序

引言:
排序算法很久没有些过啦,前段时间写了最基础的选择排序和冒泡排序,当时写它们就是为了找感觉.于是今天复习了快速排序的算法.

算法思想:
其实它的思想也很简单:
1.自己确定一个标志数key作为比较对象.
2.从最后一个开始,寻找第一个小于key的,并将其放在当前first上.
3.从第一个开始,寻找第一个大于key的,并将其放在当前last上.
4.如果first仍然小于last,继续执行2,3步骤;否则跳出循环,将key放在first上.
5.以key作为分界线,对两部分进行递归处理即可.

代码如下:

/*************************************************************************
 **     >  Name : QSort.cpp
 **     > Author: LiYingXiao (Sweethreart502) 
 **     >  Mail : liyingxiao502@gmail.com
 **     >  Blog : http://blog.csdn.net/u013166575
 **     > Created Time: 2015年11月30日 星期一 20时50分59秒
 ************************************************************************/

#include <iostream>

#define N 5

void QSort ( int a[] , int low , int high )
{
    // 首先检查参数合法性
    if ( low >= high ) {
        return ;
    }

    int first = low , last = high ;
    // 以第一个为基准
    int key = a[low] ;

    while ( first < last ) {
        // 后面的与key比较,如果小于key,则更换first值;反之last减一
        while ( first < last && a[last] >= key ) {
            last-- ;
        }
        a[first] = a[last] ;

        // 前面的与key比较,如果大于key,则更换last值;反之first加一
        while ( first < last && a[first] <= key ) {
            first++ ;
        }
        a[last] = a[first] ;
    }

    // 循环结束,将key值存储在当前first/last所在位置
    a[first] = key ;
    // 接下来继续递归调用
    QSort ( a , low , first - 1 ) ;
    QSort ( a , first + 1 , high ) ;
}

// 主函数
int main ( int argc , char * argv[] )
{
    int a[] = { 12 , 13 , 21 , 15 , 32 } ;

    // 排序前输出
    std::cout << "before of the Sort :" << std::endl ;
    for ( int i = 0 ; i < N ; i++ ) {
        std::cout << a[i] << " " ;
    }
    std::cout << std::endl ;

    QSort ( a , 0 , N - 1 ) ;

    // 排序后输出
    std::cout << "after of the Sort :" << std::endl ;
    for ( int i = 0 ; i < N ; i++ ) {
        std::cout << a[i] << " " ;
    }
    std::cout << std::endl ;

    return 0 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值