C语言实现快速排序算法

2023-05-16

快排作为公认最优秀的排序方法,是每一个程序员都应该掌握的,那么,今天就由我来为大家简单讲解一下快速排序算法的代码。

源代码如下:

#include<stdio.h>
void quicksort(int *a,int left,int right)
{
    if(left>right)
    {
        return ;
    }
    int i=left;
    int j=right;
    int key=a[left];
    while(i!=j)
    {
        while(a[j]>=a[left]&&i<j)
        {
            j--;
        }
        while(a[i]<=a[left]&&i<j)
        {
            i++;
        }
        int s;
        s=a[i];
        a[i]=a[j];
        a[j]=s;
    }
    a[left]=a[i];
    a[i]=key;
    quicksort(a,left,i-1);
    quicksort(a,i+1,right);
}
int main(void)
{
    int a[10]={6,7,8,9,10,5,3,2,4,1,};
    quicksort(a,0,9);
    int i;
    for(i=0;i<10;i++)
    {
        printf("%d ",a[i]);
    }    
}

以下是程序输出图

 下面是对于代码的讲解:

先简单讲解一下快速排序的原理,核心思想是递归。在一组数据中,我们先随机找一个数字(本程序中是最左边的数字也就是a[0])然后再利用两个指针i,j从数据二头向中间逼近,我们命名为left和right。left指向最左边,right指向最右边。当i变量找到一个值,这个值大于我们的标识值时,我们就把这个i记录下来,同理,我们再记录一个小于标识值的j,将a[i]与a[j]交换位置,直到i=j;

这是,我们将一开始的标识符与这是的a[i]交换位置,初步的快排就做好了,请注意,我们这里有一个陷阱!我现在这里卖一个关子

接着利用递归的思想,在标识符左右两端分别进行快排,直到我们的这个left=right为止。

 在函数的最开头,表现出来一种渴望,在子程序的递归中,一旦left>right了,nice!quicksort滴任务完成啦,直接return。

 确定标识值和copy一下left与right的值,方便下面操作

在i!=j这个大背景下,由于经过我们这个初步的快排之后,标识值左边的数统统小于标识值,标识值右边的数统统大于标识值,所以我们现在就开始找内鬼,有劳i与j了,j由于代表的是right,那么就要把小于标识值的抓到左边去,同理,i把大于标识值的送去右边。两者交换位置。

WARNING

还记得我刚刚卖的关子吗,我们程序的思路是将标识值与i与j值相等的那个数换位置,如果

 

我们这样进行,先找到左边的,在找到右边的,那么由于第一个循环先结束,i仍然小于j但是我们的这个值a[i]是大于a[left](不满足循环的条件)所以当我们进行交换这一步时,出现了错误,本来标识符左边的值应该统统小于它的,但是来了个内鬼(新换过去的)他的值大于标识值,所以程序出现了错误!

因此,为了避免此类错误,我们应该

 快排从右边开始!!!!!

 交换位置,完成了初步快排

进行递归,对标识符左边的元素和右边的元素分别在进行快排,直到i=j

程序结束

:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言实现快速排序算法 的相关文章

  • iptables原理和防火墙主要命令使用场景

    https www zsythink net archives 1764 朱双印的个人日志 xff0c 写的非常的通俗易懂 xff0c 好文章 https blog csdn net u011277123 article details 8
  • 链路mtu

    常常见到交换机和网卡说明中提到支持Jumbo Frame xff0c 但我一直对以太网的Jumbo Frame xff08 巨帧 xff09 如何使用不太理解 xff0c 今日在网上找到2则现摘录下来 xff0c 相信看了以后大家会有收获
  • eggjs

    https editor csdn net md not checkout 61 1 amp spm 61 1001 2014 3001 4503 https blog csdn net weixin 42304193 article de
  • mini6410上HelloQt4运行出现libQtGui.so.4: cannot open shared的原因

    主要原因是在3 3 3节中 xff0c 编写的环境变量搭建文件setqt4env中设置路径不对 export LD LIBRARY PATH 61 xff08 看看有没有文件中的目录 xff09 应该改成你所在的qt4 7目录中的lib目录
  • VINS技术路线与代码详解

    VINS技术路线 写在前面 xff1a 本文整和自己的思路 xff0c 希望对学习VINS或者VIO的同学有所帮助 xff0c 如果你觉得文章写的对你的理解有一点帮助 xff0c 可以推荐给周围的小伙伴们 xff0c 当然 xff0c 如果
  • 用MicroPython开发ESP32- 用Thonny写程序

    陈拓 2022 06 11 2022 06 12 1 简介 在 用MicroPython开发ESP32 固件烧写与测试 https zhuanlan zhihu com p 527291091 https blog csdn net che
  • 单片机 stm32 接收数据和处理

    背景 1 单片机串口接收数据处理 xff0c 这个代码已经过很多项目验证 xff0c 没有问题 用这个代码帮了好几个同事解决数据接收久了就异常 2 这个代码做到接收和处理分开 避免不必要的处理逻辑问题 3 也可用于网口tcp xff0c u
  • odroid Xu4介绍

    Odroid xu4介绍 下面对这块开发板做一下简单的介绍 xff0c 共需要用到的人参考 从参数上来看 xff0c ODROID XU4的整体性能基本和目前的中端智能手机差不多 xff0c 它搭载了主频
  • OdroidXu4开发环境搭建

    OdroidXu4开发环境搭建 一 烧录镜像 1 SD卡烧录 首先准备一张至少16G的sd卡 镜像可以在官网 xff1a http odroid com dokuwiki doku php id 61 en odroid xu4 softw
  • 大小端:字节序与比特序

    https blog csdn net fzy0201 article details 26876711 https blog csdn net qq 40334837 article details 89042607 前言 前两天被问到一
  • VLC Buffering机制介绍

    一 简介 了解一定播放器知识的同学应该都知道 xff0c 播放器内部是有缓存的 xff08 非直播场景 xff09 缓存的作用主要是解决生产者和消费者速度的不匹配 xff0c 给用户更好的使用体验 例如 xff0c 在网络不稳定的情况下 x
  • Linux静态库和动态库学习总结

    一 废话 之前由于工作需要 xff0c 要封装一个Linux加密解密转换的动态库 xff0c 这个之前只做过Windows下面的 xff0c Linux下面还真没有做过 xff0c 之后做了整一个晚上才算做好 xff0c 不过其中也学到了不
  • UART的FIFO功能

    经常听到UART的FIFO功能 xff0c 但是从来没有真正使用过和认真思考过它的作用 正好有客户用到这个功能 xff0c 在这里做个总结 FIFO 是 First In First Out 的缩写 xff0c 它是一个具有先入先出特点的缓
  • 《C语言内核深度解析》笔记(3):指针才是C语言的精髓

    第03章 指针才是C语言的精髓 3 2 指针 int a 61 10 int p 61 amp a 指针变量p和普通变量之间没有本质区别 xff0c 都是变量空间放了一个数值 xff0c 只是p里面的数值比较特殊 xff0c 是a空间的地址
  • 相机针孔模型----从世界坐标系,到相机坐标系,再到图像物理坐标系,最后到图像像素坐标系的转换过程解析

    看了很多讲解针孔相机模型中从世界坐标系 gt 到相机坐标系 gt 图像坐标系的文章 xff0c 心里的疑惑也逐渐展开 xff0c 现在总结一下自己的理解 xff1a 世界坐标系 相机坐标系 图像物理坐标系 图像像素坐标系在我的另一篇博文里已
  • D1 R32 – ESP32+Arduino CNC Shield控制步进电机

    陈拓 2023 04 01 2023 04 05 1 简介 在 Arduino Uno开发板 43 电机驱动扩展版CNC Shield V3 0硬件说明 https blog csdn net chentuo2000 article det
  • pixhawk当中关于NMEA类型的gps数据处理流程

    1 启动跟新gps的数据的任务是在ArduCopter cpp中scheduler tasks中 调用的速度是50hz 2 通过执行update GPS方法中的 3 调转到ap gps cpp中的update方法中 4 在update中通过
  • C++Eigen库的配置和基本使用

    1 配置 1 下载 http bitbucket org eigen eigen get 3 2 5 tar bz2 2 配置 文件夹名字较长 xff0c 解压后可重命名 xff0c 如我命名为eigen3 xff0c 把D program

随机推荐