快排的理解

快速排序可以说是最为常见的排序算法,冒泡排序时间复杂度达到了O(N2),而桶排序容易造成浪费空间。快排(Quicksort)就成为了不错的选择。

1、原理:快排需要找一个数作为基准数,用来参照。(可取第一个数为参照)

        基准数在中间某位置,两端有指针,找到相应数后,交换。

注意:若令第一个数为基准数,先从右往左找,再从左往右找。

2、优点:平均时间复杂度O(NlogN),相比冒泡排序每次交换可以是跳跃式的

排序过程:

在这里插入图片描述

代码:

#include<stdio.h>
int a[101],n;//定义全局变量,需要在子函数中使用

void quicksort(int left,int right){
    int i,j,t,temp;
    if(left>right)
    return;

    temp=a[left];//用来存基准数
    i=left;
    j=right;

    while(i!=j){
        //从右往左找
        while(a[j]>=temp&&i<j)
            j--;
        //从左往右找
        while(a[j]<=temp&&i<j)
            i++;
        
        //swap
        if(i<j){
            t=a[i];
            a[i]=a[j];
            a[j]=t;
        }
    }
    //基准数归位
    a[left]=a[i];
    a[i]=temp;

    quicksort(left,i-1);//递归
    quicksort(i+1,right);//递归

    return;

}
int main(){
    int i,j;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    quicksort(1,n);

    for(i=1;i<=n;i++){
        printf("%d ",a[i]);
    }
    //getchar();getchar();

    return 0;
}

3、通过改变基准数的选取来优化代码

4、结构体+快排(以科目+成绩为例)

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

struct S{
    char subject[2000];
    long int score;
}subject[1001],p,temp;

void Qsort (int left,int right){
    int i,j,t;
    if(left>right){
        return;
    }

    temp=subject[left];
    i=left;
    j=right;
    while(subject[j].score>=temp.score&&i<j){
        j--;
    }

    while(subject[i].score<=temp.score&&i<j){
        i++;
    }
    if(i<j){
        p=subject[i];
        subject[i]=subject[j];
        subject[j]=p;
    }
    subject[left]=subject[i];
    subject[i]=temp;

    Qsort(left,i-1);
    Qsort(i+1,right);
}
int main(){
    long int num=0;
    scanf("%ld",&num);

    struct S t;
    for(long int i=1;i<=num;++i){
        scanf("%s %ld",subject[i].subject,&subject[i].score);
    }

    Qsort(1,num);

    for(long int i=1;i<=num;i++){
        printf("%s ",subject[i].subject);
    }

    return 0;

}

5、qsort函数

为了使用方便,C语言在库中自带了快排函数

函数原型

#include<stdlib.h>

void qsort(void*, size_t, size_t, int ( * )(const void * , const void * ))

1、第一个参数为待排序数组首地址。
可直接输入待排序数组名,或是指向数组的指针。

2、第二个参数为数组长度。
size_t是标准C库中定义的,应为unsigned int,在64位系统中为 long unsigned int。
可以直接输入待排序的数组的长度。

3、第三个参数为数组元素所占字节。
可直接用sizeof(a[0])计算字数组单个元素的节数。

4、第四个参数为所调用函数的指针,函数名即是函数的指针,可直接写函数名,调用函数用来确定排序的方式。

 详情见【C语言】快速排序函数qsort()_zhangshuo的博客-CSDN博客_qsort函数c语言

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
快排是指快速排序,它是一种解决排序问题的运算方法。快排的原理是,在组中任意选择一个字作为基准,然后将组中的元素根据与基准的大小关系分为两部分,一部分是小于基准字,一部分是大于基准字。然后将两部分再分别进行快排,直到组完全有序。快排是python中的经典算法之一,它通过分而治之的思想,将大问题分解成小问题来解决。快排的图示可以通过实际的例子或者使用可视化工具来展示,以更直观地理解算法的执行过程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [python快排全套带环境前后端.zip](https://download.csdn.net/download/a772483200/12914570)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [python快排算法详解](https://download.csdn.net/download/weixin_38605967/13995730)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [python进行据增强](https://download.csdn.net/download/doyoboy/88278532)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值