C/C++实现快速排序

14 篇文章 0 订阅

1.思想就是递归的分而治之,每次递归就做两件事:分段,对这个段依照pivot进行粗略的排序

2.对于分好的段,求出其中位数为pivot,然后小于pivot的全都放到这个段的左边,大于pivot的全都放到这个段的右边,下面是实现代码

#include<stdio.h>
#include<stdlib.h> 

template <typename T> class QuickSort
{
    private:
        void swap(T &a,T &b)//交换两个参数的值 
        {
            T   t;
            t = a;
            a = b;
            b = t;
        }
        int medium3(T *data,int left,int right)//求出pivot,并且排序 
        {
            int center = (left+right)/2;
            if(data[left]>data[center])
                swap(data[left],data[center]);
            if(data[left]>data[right])
                swap(data[left],data[right]);

            if(data[center]>data[right])
                swap(data[center],data[right]);
            //data[center]为pivot
            swap(data[center],data[right-1]);
            return data[right-1];
        }
        void     Qsort(T *data,int left,int right)
        {
            if(right-left<2) return; //递归结束 
            int pivot = medium3(data,left,right);//求出这个段的中位数
            int i=left,j = right-1;
            while(1)
            {
                while(data[++i]<pivot){
                    ;
                }
                while(data[--j]>pivot){
                    ;
                }
                if(i<j){
                    swap(data[i],data[j]);
                }else{
                    break;
                }
            }
            swap(data[i],data[right-1]);
            Qsort(data,left,i-1);
            Qsort(data,i+1,right);
        }
    public:
        void Quicksort(T *data,int n)
        {
            Qsort(data,0,n-1);
        }

};
int main()  
{  

    int     d[]={4,6,1,3,9,100,-90};/待排序的数组
    QuickSort<int>  qs;//创建快排模板类
    qs.Quicksort(d,7);//调用排序成员函数
    for(int i=0;i<7;i++) 
        printf("%d\t",d[i]);
    return 0;  
} 

这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值