算法分析:快速排序

快速排序(quicksort)是在实践中最快的已知排序算法。

平均运行时间是O(NlogN),最坏的情形是O(N^2)

算法之所以特别快,主要是由于非常精炼和高度优化的内部循环。

1.如果S中元素个数是0或1,则返回

2.取S中任一元素v,成为枢纽元(pivot)

3.将S-{v}(S中其余元素)划分成两个不想交的集合:左边<v,右边≥v。

4.返回左边的排序,后跟v,继而右边的排序。

当子数组的长度小于10 的时候,使用了插入排序 算法分析:插入排序

//
//  Sort.h
//  HelloWorld
//  csdn blog:http://blog.csdn.net/u012175089
//  Created by feiyin001 on 17/1/11.
//  Copyright (c) 2017年 FableGame. All rights reserved.
//

#ifndef __HelloWorld__Sort__
#define __HelloWorld__Sort__
#include <vector>
using namespace std;
namespace Fable
{
    //选取枢纽的函数
    template<typename Comparable>
    const Comparable& median3(vector<Comparable>& a ,int left, int right)
    {
        int center = (left + right)/2;//中间的下标
        if (a[center] < a[left])
        {
            swap(a[left], a[center]);//将小的放在左边
        }
        if (a[right] < a[left])
        {
            swap(a[left], a[right]);//将小的放在左边
        }
        if (a[right] < a[center])
        {
            swap(a[center], a[right]);//将大的放在右边
        }
        swap(a[center], a[right-1]);//将中间值放在right-1的位置
        return a[right-1];//返回中间值
    }
    template<typename Comparable>
    void quicksort(vector<Comparable>& a, int left, int right)
    {
        if (left + 10 <= right)//这个子数组大于10,继续使用快速排序
        {
            Comparable pivot = median3(a, left, right);//枢纽值
            int i = left;//i指向左边
            int j = right - 1;//j指向右边,现在i和j都是已经比较过的了,等下是先++和--
            while (true)
            {
                while (a[++i] < pivot) {}//小于枢纽值的元素是一直放在左边,找出一个大的元素
                while (pivot < a[--j]) {}//大于枢纽值的元素是一直放在右边,找出一个小的元素
                if (i < j)
                {
                    swap(a[i], a[j]);//i和j还没有交汇,交换位置
                }
                else
                {
                    break;//这个时候i指向的数是应该比枢纽值大的了
                }
            }
            swap(a[i], a[right - 1]);//将枢纽值放在i的位置
            quicksort(a, left, i - 1);//分别对枢纽值左边的子数组排序
            quicksort(a, i + 1, right);//分别对枢纽值右边的子数组排序
        }
        else
        {
            //使用插入排序,数组大小小于10的时候
            insertionSort(a.begin() + left, a.begin() + right + 1);
        }
    }
    //快速排序
    template <typename Comparable>
    void quicksort(vector<Comparable>& a)
    {
        quicksort(a, 0, a.size() - 1);
    }
}

#endif /* defined(__HelloWorld__Sort__) */


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值