快速排序【递归分治法】

算法核心:

快速排序是基于分治策略的一种性能比较好的一种排序算法。

基本思想:
通过一趟排序将待排记录分割成独立的两个部分,其中一部分的关键字均比另一部分的关键字小,然后对这两个部分记录分别继续排序,已达到整个序列有序的目的。
步骤
(1)分解(Divide):以a[p]为基准元素将a[p:r]划分成3段a[p:q-1] a[q]和a[q+1:r],使a[p:q-1]中的任何一个元素小于等于a[q],a[q+1:r]中任何一个元素大于等于a[q]。下标q在划分过程中确定。
(2)递归求解(Conquer):通过递归调用快速排序算法分别对a[p:q-1]和a[q+1:r]进行排序。
(3)合并(Merge):由于对a[p:q-1]和a[q+1:r]的排序是就地进行的,所以在a[p:q-1]和a[q+1:r]都已经排好顺序了,不需要级执行任何的计算,a[p:r]就已经排序完成。
算法实现:
方法一:这个方法是借鉴书上的,很合理,值得记住。

#include <stdio.h>
#include <stdlib.h>
//方法一
int Partition(int L[],int low,int high);
void QSort(int L[],int low,int high);
//方法二 做标记法
void QuickSort(int L[],int low,int high,int flag,int value,int serial);
void Input(int L[],int x);
void Print(int L[],int x);
int main()
{
    int x;
    int L[40]={0};
    printf("请输入序列个数\n");
    scanf("%d",&x);
    Input(L,x);
    QSort(L,0,x-1);//注意端点
    Print(L,x);
    return 0;
}

int Partition(int L[],int low,int high){
    int Privotkey=L[low];
    while(low<high){
        while(low<high && L[high]>Privotkey)//将不想要的情况都循环结束。
            high--;
        L[low]=L[high];
        while(low<high && L[low]<Privotkey)
            low++;
        L[high]=L[low];
    }
    L[low]=Privotkey;
    return low;
}

void QSort(int L[],int low,int high){
    int privotloc;
    if(low < high)
    {
        privotloc=Partition(L,low,high);//递归中非递归的部分可以单独成函数
        QSort(L,low,privotloc-1);
        QSort(L,privotloc+1,high);
    }
}

void Input(int L[],int x){
    int i;
    for(i=0;i<x;i++)
        scanf("%d",&L[i]);
}

void Print(int L[],int x){
    int i;
    for(i=0;i<x;i++)
        printf("%d ",L[i]);
}

运行结果如下:
这里写图片描述
代码可以直接运行,做过测试,感觉速度还是可以的。
下面的这种方法是我自己草拟写出来的,结果后来验证发现除了问题,我就没有继续做任何下去的补充了。因为相对于上面的这种,这个方法已经没有意义了。
方法思路:将对于一次快速排序的过程同总的过程一起用递归实现,用一个函数来代替上面的。结果发现在两个不同的递归过程中,参数的改变成为了一个大问题。现在将代码写出来,做个记录,方便思维拓展。
这个方法有问题,注意low的值已经换了,不能再用了,所以这种方法又麻烦,有不合适

void QuickSort(int L[],int low,int high,int flag,int value){//这个方法有问题,注意low的值已经换了,不能再用了,所以这种方法又麻烦,有不合适

   if(low>=high){
        L[low]=value;
    QuickSort(L,low,serial-1,1,L[low]);
    QuickSort(L,serial+1,high,1,L[serial+1]);
   }
   if(flag==1){
    while(low<high && value<L[high])
        high--;
    L[low]=L[high];
    QuickSort(L,low++,high,2,value);
   }
   else{
    while(low<high && value>L[low])
        low++;
    L[high]=L[low];
    QuickSort(L,low,high--,1,value);
   }
}

大家有什么问题请留言。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值