当前位置: 首页 > news >正文

排序 --- 快速排序

文章目录

    • (一)概念
    • (二)基本思想
    • (三)排序流程
    • (三)代码实现

(一)概念

快速排序相当于对冒泡排序的一个优化,也是基于交换的排序算法
时间复杂度 O(nlogn)

(二)基本思想

通过一趟排序,将待排序数据分成两部分,其中一部分数据都比另一部分小,而这两部分数据的内部不要求有序;
然后再对这两部分数据做同样的操作,也各自分成一大一小两部分,依次类推,直到整个数据组有序

(三)排序流程

定义两个下标变量,分别指向待排序的数组段的头和尾
以下图为例:
在这里插入图片描述
定义一个flag变量记录左侧第一个元素flag=arr[low](为了编程方便,也可以记录右侧第一个元素),然后从右向左开始依次比较flag和数组元素的大小

  • 注:此处不要写成flag=arr[0]; 因为之后要对左右半边分别递归使用该函数,当对右半边排序时,应该使flag等于右半边的最左侧的数

如果flag<arr[high],就执行high- -,即下标high向左移动
在这里插入图片描述
如果flag>arr[high],就执行arr[low]=arr[high],low++,但是前提条件是low<high
在这里插入图片描述
此时再从左往右依次比较flag和arr[low]的大小
如果flag>arr[low],就执行low++
在这里插入图片描述
如果flag<arr[low],就执行arr[high]=arr[low],high- -,但是前提条件是low<high
在这里插入图片描述

循环上述两个步骤直到low==high时,将arr[low]=flag或者arr[high]=flag
此时flag左边都是比flag小的数,flag右边都是比flag大的数,但是两侧无序
在这里插入图片描述
之后再对左半边和右半边分别排序
此处仅以右半边为例,左半边同理,只是low和high的值不同。
右半边:low=5,high=9(左半边:low=0,high=3)
在这里插入图片描述
首先使flag=arr[low],此处为7
然后判断flag<arr[high]? 如果小于,就执行high- -
在这里插入图片描述

如果大于就执行arr[low]=arr[high],low++
在这里插入图片描述
之后判断flag>arr[low]? 如果大于,就执行low++
如果小于就执行arr[high]=arr[low],high- -
在这里插入图片描述
直到low==high时,arr[low]=flag或者arr[high]=flag
在这里插入图片描述
此时flag左边的值是比flag小的,右边的值是比flag大的,但是左右两边是无序的,因此再次执行上述操作使当前数据段再次分成左右两部分,再次分别对左右两部分进行排序。
因此使用递归即可完成,递归函数中实现的功能就是:
先调用一次sort函数,确定了flag的位置,然后再分别对左半边和右半边排序,直到左右半边无法再继续分隔,即出现low>high或者low==high的情况,此时即是递归函数的出口。

(三)代码实现

#include <stdio.h>

int print(int *arr,int len){
    if(NULL==arr) return -1;
    for(int i=0;i<len;i++){
        printf("%d ",arr[i]);
    }
    putchar(10);
    return 0;
}

int my_sort(int *arr,int low,int high){
    if(NULL==arr) return -1;
    int flag=arr[low];
    while(low < high){
        while(flag<arr[high]&&low<high){
            high--;
        }
        if(low<high){
            arr[low]=arr[high];
            low++;
        }
        while(flag>arr[low]&&low<high){
            low++;
        }
        if(low<high){
            arr[high]=arr[low];
            high--;
        }
    }
    arr[low]=flag;
    return low;
}

int quick_sort(int *arr,int low,int high){
    if(NULL==arr) return -1;
    if(low < high){
        int ret=my_sort(arr,low,high);
        quick_sort(arr,low,ret-1);
        quick_sort(arr,ret+1,high);
    }
    return 0;
}

int main(int argc, char const *argv[]){
    int arr[10]={5,2,3,10,7,1,4,9,6,8};
    printf("排序前:\n");
    print(arr,10);

    printf("排序后:\n");
    quick_sort(arr,0,9);
    print(arr,10);
    
    return 0;
}

相关文章:

  • 网络配置与pip工具安装
  • 文件上传漏洞 upload-labs靶场
  • 开源数字人模型Heygem
  • 【学习笔记】《逆向工程核心原理》02.小段标记法、IA-32寄存器、栈、abex‘crackme、栈帧
  • 说一下spring的事务隔离级别?
  • 爱可以传递,幸福可以具象化
  • 基于SpringBoot的“体育购物商城”的设计与实现(源码+数据库+文档+PPT)
  • 从零开始 | C语言基础刷题DAY1
  • C++跨平台开发环境搭建全指南:工具链选型与性能优化实战
  • 信息安全风险管理简述(下):如何进行风险评估
  • 解决 GitHub Pull Request 中 DCO 问题(缺少Signed-off-by行的问题)
  • shell脚本基础
  • 防抖和节流
  • (二)seacmsv9注入管理员账号密码+orderby+limit
  • 炫云云渲染以技术赋能影视视效,打造视觉盛宴!
  • Go_zero学习笔记
  • Movavi Photo Editor深度解析:图片分辨率提升与老照片修复神器
  • React 如何实现组件懒加载以及懒加载的底层机制
  • Linux学习——使用QEMU搭建ARM64环境
  • 【AI】基于多模态火车票数据提取
  • 中国巴西关于乌克兰危机的联合声明
  • 中国创面修复学科发起者之一陆树良教授病逝,享年64岁
  • 从这些电影与影像,看到包容开放的上海
  • 郑州通报涉“健康证”办理有关问题查处进展情况
  • 中医的千年传承:网络科学描绘其演化之路|PNAS速递
  • 超新星|罚丢点球的那道坎,刘诚宇靠自己迈了过去