算法导论学习--快速排序--Quicksort

快排采用的是分治的算法思想,将一个无序数列取一个基元.此处将最右边的元素作为基准.
第一次:5,8,13,6,7,52,64,2,40,1 ← r-1(基准下标,作为第一次判断)
i=-1,j=0;
j=1:判断8>1–j++;
j=2:判断13>1–j++;
j=3:判断6>1–j++;
…… (之间均无比1小的元素)
j=r-1:判断40>1–j++;
change:A[r-1]←→A[i+1]//当i取得值为中间某值时经由上述判断,A[i]之后的均为大于等于基准的值.A[i]之前的值均为小于等于基准的值.
故这个值一旦进行swap后,这个值就确定在该位置,
之后进行对左边进行大小排序(大小排序只是确定该基准左边为大于该基准的值,右边为小于该基准的值,但并不提供排序).
之后将这个值”搁置争议”再对左右进行大小排序,排序到最后得到的则是已经排好顺序的值.

加油!!
这里写图片描述

#include<stdio.h>
Sort(int *disorder,int p,int r)
{
    Quicksort(disorder,p,r);
}

int PARTITION(int *A,int p,int r)
{
    int x=A[r];//主元为最右边元素
    int i=p-1,j=p,temp;
    for(;j<=r-1;j++)
    {
        if(A[j]<=x)
        {
            i++;
            temp=A[j];
            A[j]=A[i];
            A[i]=temp;
        }
    }
    temp=A[r];
    A[r]=A[i+1];
    A[i+1]=temp;
    return i+1;
}

Quicksort(int *A,int p,int r)
{
    int q;
    if(p<r)
        {
            q=PARTITION(A,p,r);//q:接收当前排序结束后最终指向的基准
            Quicksort(A,p,q-1);//对左继续
            Quicksort(A,q+1,r);//对右继续
        }
}


int main()
{
    int disorder[10]={5,8,13,6,7,52,64,2,40,1};
    int p=10,i;//p=length(disorder),以p-1为基准
    Sort(disorder,0,p-1);
    for(i=0;i<p;i++)
        printf("%d ",disorder[i]);
}

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值