写一个快速排序

尴尬就一个快速排序的算法。。。。(感谢师兄的帮助大笑

主要思路:

选定一个基准值,将数组分成两部分,比基准值小的在左边,大的在右边。。。


代码:

//主函数
void sort(int *a,int low,int high)
{
    if(low < high)
    {
        int m=part(a,low,high);
        sort(a,low,m-1); //m之前的那部分进行排序
        sort(a,m+1,high);  //m之后的那部分进行排序
    }
}

//分区部分
int part(int *a,int low,int high)
{
    while(low<high)          //相遇时跳出
    {
        while(low<high && a[low]<=a[high]) //下标high从右端开始向左递减,直到两下标相遇
        {                                  //或者a[high]的值小于a[low]的值
            --high;
        }
        swap(a[low],a[high]);    //交换两个值
        while(low<high && a[low]<=a[high]) //交换完成后下标low从左往右递增,直到两下标相遇
        {                                 //或者a[low]的值大于a[high]的值
            ++low;
        }
        swap(a[low],a[high]);    //交换两个值
    }
    return low;   //返回基准值移动后的下标
}

分区部分的示意图:





下面再补上一个非递归实现的:大笑

void sort(int *a,int low,int high)
{
    if(low < high)
    {
        int i=low,j=high;
        while(i<j)
        {
            while(i<j && a[i]<=a[j])
            {
                --j;
            }
            swap(a[i],a[j]);
            while(i<j && a[i]<=a[j])
            {
                ++i;
            }
            swap(a[i],a[j]);
        }
        sort(a,low,i-1);
        sort(a,i+1,high);
    }
}

调用过程:

int main()
{
    int a[]={2,158,65,51,41,345,415,15,415,41654,4,46,1,56,4,84,5,4154,5,4,84,5,4,98,48,74,89,9,8,9,8,2,5,89,54,54,6,4864,684,64,64,8,48,486,49,98,658,4,845,89,4896,4,74,89,4586,4,68,48,64,9,654,4,484};
    sort(a,0,sizeof(a)/sizeof(a[0])-1);
    copy(a,a+sizeof(a)/sizeof(a[0]),ostream_iterator<int>(cout," "));
}

运行截图:


(注:那个时间不准的,无视它吧吐舌头


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值