文章目录

  • 前言
  • 一、快速排序是什么?
    • 实现原理
  • 二 操作步骤
    • 快速排序代码块

前言

冒泡排序在啊哈算法中算是第一个学习的真正的排序算法,解决了桶排序的空间浪费,但是冒泡排序的时间上又略显不足O{n^2}。
注意
有一种算法既不浪费空间,又可以快一点的排序算法叫:
“快速排序”!

一、快速排序是什么?

快速排序可以认为是冒泡排序的升级,他们都属于交换排序类,即都是通过不断比较和移动排序交换来实现排序的。
优越性:它的实现,增大了记录的比较和移动的距离,在6,10,3,8,4,2,1。这几个数中以6为关键词,将比6大的关键数直接移动到后面,比6小的数直接移动到前面,这样可以大大减少比较次数和移动交换次数。

实现原理

通过一趟排序,将待排记录分割成独立的两部分,其中一部分纪录的关键字比另一部分记录的关键字,则可分别对这两部分记录继续进行排序,已达到整个序列有序的目的。

二 操作步骤

首先我们看下面这张图片


我们对以上数进行排序。首先随便找一个数做基准数(就是个参照数)
这里就让50做基准数吧。刚刚上面说了选择一个数,然后将数组分割成为两个部分,所以我们现在需要将6移动到中间的某个位置,但只要以上所有数中左边的数都小于50,右边的数都大于50就行


因我们要把这个数组分割成小的一部分,大的一部分,所以我们我们分别从两端开始探测,设立两个哨兵,

首先哨兵J开始出动,因为此处设置的基准数是最左边的数,所以需要让哨兵这些出动,这一点非常重要,其实自己想想为什么哨兵这一步一步地向左移动,即J减减,直到找到一个小于50数停下来,接下来哨兵i,在一步一步向右移动,即i++直到找到一个大于六的数停下来,最后i停在数字50,哨兵j停在20这里


所以50 和20开始交换。接下来哨兵j继续向左挪动(提醒一下,每一次都是j先出发哦!),当j在发现比50小的数时停了下来,i开始继续向右挪动,遇到了90,停了下来。

此时再次进行交换,交换后的序列应是如下

以此类推后,直到i和j相遇,第一次探测结束
如下图:基准数以50为分界线,左边的数都小于50,右边的数都大于50.
然后以50为分界点,拆分为两个序列,左边:20,10,40,30,
右边:70,80,60,90
在分别开始排序
对左边开始调整,这里你们就可以动手尝试一下,实践一下!

如果还有不是很理解的地方,下面这张图可能能帮到你
注:以下是书本上给的数组,上面的数组是我从其他书上找到,也是一本不错的书叫–《大话数据结构》,但是原理都是一样的,不用担心。

快速排序代码块


//快速排序
int a[101],n;//定义全局变量,这两个变量需要在子函数中使用。void quicksort(int left,int right){int i,j,t,temp;if(left>right){return;}temp=a[left];  //找基准点i=left;        //哨兵ij=right;       //哨兵jwhile(i!=j)   {//顺序很重要的哦!还记得从哪边先出发吗?while(a[j]>=temp){j--;}while(a[i]<temp){i++;}//交换位置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]);printf("  ");}getchar();getchar();return 0;

啊哈算法---快速排序(C语言)相关推荐

  1. 快速排序算法的C语言实现

    快速排序算法的C语言实现1 快速排序主要基于"二分"的思想,每次找出一个基准数从而将数列以基准数为界限分为两部分,接着再对左右两边的数列再次排序(即再次调用该排序函数).以上为本人 ...

  2. 最简单的快速排序算法的C语言实现

    这个快速排序算法可能不是效率最高的,但它是最简单的算法之一. 快速排序算法是由C.A.R.Hoare于1962年发明的.对于一个给定的数组,从中选择一个元素,以该元素为界将其与元素划分为两个子集,一个 ...

  3. 快速排序算法(c语言读取文件数据)

    本节介绍一种排序算法--快速排序算法(Quick Sort). C语言中自带函数库中就有快速排序--qsort函数 ,包含在 <stdlib.h> 头文件中. 快速排序算法是在起泡排序的基 ...

  4. 十种经典排序算法精粹(c语言版本)

    下面给出这段时间我苦心研究验证过的十种经典排序算法的C语言版本,即下面的排序算法: 插入排序,shell排序,冒泡排序,快速排序,选择排序,堆排序,归并排序,桶排序,基数排序和计数排序.整理出来以作备 ...

  5. 资料分享:送你一本《数据结构与算法:Python语言描述》电子书!

    下图为 TIOBE 3月编程语言排行榜. 从榜单来看,曾经铁打的 Java.C.C++ 局势,早已在数月前被 Python 的闯入而打破.究其根由,并非是 C++ 的应用领域正在逐渐缩减,而是随着人工 ...

  6. 常见排序算法(C语言实现)

    常见排序算法(C语言实现) 文章目录 常见排序算法(C语言实现) 一.插入排序 二.希尔排序 三.选择排序 四.堆排序 五.冒泡排序 六.快速排序 七.归并排序 一.插入排序 void insertS ...

  7. 数据结构与算法(C语言)

    第一章: 数据结构绪论 1.什么是程序:程序 = 数据结构 + 算法 2.逻辑结构&物理结构的区别用法 基本的目标就是将数据及其逻辑关系存储到计算机的内存中 一:逻辑结构: 逻辑结构是指数据对 ...

  8. 数据结构-排序算法(c语言实现篇)

    数据结构-排序算法(c语言实现篇) 排序算法是非常常用的算法,从介绍排序的基本概念,到介绍各种排序算法的思想.实现方式以及效率分析.最后比较各种算法的优劣性和稳定性. 1 排序的概念及应用 1.1 排 ...

  9. JavaScript的排序算法——快速排序

    排序算法(Sorting algorithm)是计算机科学最古老.最基本的课题之一.要想成为合格的程序员,就必须理解和掌握各种排序算法. 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排 ...

  10. 迪杰斯特拉算法(C语言实现)

    迪杰斯特拉算法(C语言实现) 如上图,求以a为源点到个顶点的最短路劲. #include "stdio.h" #include "stdlib.h" //用一个 ...

最新文章

  1. 第十四周项目三-数组类模板
  2. jboss中控制台jmx-console 登录的用户名和密码设置
  3. ASP.NET中验证控件的使用
  4. 2021考研数学一李林4套卷整理
  5. Evaluation of Deep Learning Toolkits
  6. SQLServer常见性能问题
  7. Elasticsearch常用工具清单
  8. LINQ之路 2:C# 3.0的语言功能(上)
  9. CentOS 6.9通过RPM安装EPEL源(http://dl.fedoraproject.org)
  10. [C++STL]C++实现unordermap容器和unorderset容器
  11. “用户、组或角色'XXX'在当前数据库中已存在”问题
  12. AutoIt Windows的自动化脚本
  13. 4种方法帮你解决IntelliJ IDEA控制台中文乱码问题
  14. 2018.06.30 BZOJ1857: [Scoi2010]传送带(三分套三分)
  15. 硬盘分区变为RAW文件系统后的解决办法
  16. VBA玩转系统剪贴板
  17. SRE岗位理解(上篇)—读SRE实战手册有感
  18. 树莓派在身份证件核验领域应用
  19. 工控行业学什么编程语言比较好_机器人学中最流行的10种编程语言
  20. 计算机网络-什么是网络协议?

热门文章

  1. 高等代数(第四版) 王萼芳、石生明编|高等教育出版社 大学课后习题答案
  2. 大数据公司挖掘数据价值的49个典型案例(值得收藏)
  3. 2022医疗AI行业研究白皮书 附下载
  4. 斐讯k2刷无线打印服务器,斐讯K2全版本刷机教程
  5. Wke阅读日记1--简介
  6. tensorflow2 搭建LeNet5训练MINST手写数字数据集并用c++ opencv4.5.5 DNN加载模型预测结果
  7. 基于深度学习的单目人体姿态估计方法综述(一)
  8. 在浏览器上打开swf文件时变成了下载swf文件解决方式
  9. php web开发实用教程答案,PHP Web开发实用教程
  10. matlab微带带通滤波器,小型化宽阻带微带带通滤波器的设计方案