Qsort

在这里插入图片描述
在这里插入图片描述
思路:将第一次Qsort单独列出来,因为只有第一次的pivot取值与Qsort函数中对于pivot的取值是不同的。
整体来讲需要写3个函数:
Qsort函数,取pivot将其放在需要比较的数组的最后一个(也就是原数组的倒数第二个,因为原数组的最后一个在取pivot的时候已经比较完成,其值一定大于pivot),i从第二个数开始后移(原数组的第一个数在取pivot时也已经完成比较,一定比pivot小),如果大于pivot则停下,j从pivot所处位置的前一个开始前移(也就是原数组的倒数第三位),如果小于pivot就停下;如果i<j,则交换,否则将i相对应的数的大小与pivot相比较,更大的放在原数组的倒数第二位上
Median3函数:选择数组的首位,末位,中间位,相互比较大小,去中间值为pivot,并将其按照大小顺序以此放在数组首位、末位、倒数第二位上,便于后续调用数据
Insertionsort函数:在数据量较小时,使用插入排序会快于qsort
其他具体解释在代码里:

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

void Qsort(int *number, int left, int right);
int Median3(int *number,int left, int right);
void Insertionsort(int *number, int left, int N);

int main()
{
    int number[11];
    int n;
    int pivot;
    int temp;
    int left=0;
    int right=9;
    int i,j;
    scanf("%d",&n);//由题,n为给定的第一次排序的pivot//
    number[0]=49;
    number[1]=38;
    number[2]=65;
    number[3]=97;
    number[4]=76;
    number[5]=13;
    number[6]=27;
    number[7]=50;
    number[8]=2;
    number[9]=8;
    number[10]=0;
    pivot = number[n];//将第一次的pivot与末位交换//
    number[n]=number[right];
    number[right]=pivot;
    if(left+3<=right)//如果数据量可以使用Qsort//
    {
        printf("Qsort(%d,%d):",left,right);
        i=left-1;//第一次排序的特殊点在于给定了pivot,我们还没有比较它和首位的大小,所以这里的i是从-1开始的(后续我们需要使用++i)//
        j=right;//原因同上,j从最后一个开始,因为要使用--j//
        for(; ;)
        {
            while(number[++i]<pivot){}
            while(number[--j]>pivot){}
            if(i<j)
            {
                temp=number[i];
                number[i]=number[j];
                number[j]=temp;
            }
            else
            {
                break;
            }
        }
        if(pivot<number[i])//找到pivot所处的位置//
        {
            temp=number[i];
            number[i]=number[right];
            number[right]=temp;
        }
    }
    for(int d=0;d<10;d++)
    {
        printf("%d,",number[d]);
    }
    printf("\n");
    //printf("here:%d:::",i-1);
    Qsort(number,left,i-1);//左侧排序//
    //printf("now:");
    Qsort(number,i+1,right);//右侧排序//
    
    return 0;
    
    
}
int Median3(int *number,int left, int right)
{
    int center=(left+right)/2;
    int temp;
    if(number[left]>number[center])
    {
        temp=number[left];
        number[left]=number[center];
        number[center]=temp;
    }
    if(number[left]>number[right])
    {
        temp=number[left];
        number[left]=number[right];
        number[right]=temp;
    }
    if(number[center]>number[right])
    {
        temp=number[center];
        number[center]=number[right];
        number[right]=temp;
    }
    temp=number[center];
    number[center]=number[right-1];
    number[right-1]=temp;
    
    return number[right-1];
}

void Qsort(int *number, int left, int right)
{
    int i,j;
    int temp;
    int pivot;
    if(left+3<=right)
    {
        pivot=Median3(number,left,right);
        i=left;
        j=right-1;
        for(; ;)
        {
            while(number[++i]<pivot){}
            while(number[--j]>pivot){}
            if(i<j)
            {
                temp=number[i];
                number[i]=number[j];
                number[j]=temp;
            }
            else
            {
                break;
            }
        }
        if(pivot<number[i])
        {
            temp=number[i];
            number[i]=number[right-1];
            number[right-1]=temp;
        }
        printf("Qsort(%d,%d):",left,right);
        for(int k=0;k<10;k++)
        {
            printf("%d,",number[k]);
        }
        printf("\n");
        Qsort(number,left,i-1);
        Qsort(number,i+1,right);
    }
    else
    {
        if(left==right)
        {
            printf("insert(%d,%d):",left,right-left+1);
            for(int k=0;k<10;k++)
            {
                printf("%d,",number[k]);
            }
            printf("\n");
        }
        else
        {
            Insertionsort(number,left,right-left+1);
        }
        
    }
}
void Insertionsort(int *number, int left, int N)
{
    int j,p;
    int tmp;
    for(p=left+1;p<N+left;p++)
    {
        tmp=number[p];
        for(j=p;j>left&&number[j-1]>tmp;j--)
        {
            number[j]=number[j-1];
        }
        number[j]=tmp;
    }
    printf("insert(%d,%d):",left,N);
    for(int k=0;k<10;k++)
    {
        printf("%d,",number[k]);
    }
    printf("\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值