常见排序算法总结(4)快速排序

一篇文章,带你搞懂 快速排序 (注:代码语言的选择不应该限制了我们对算法的理解)

文章附有动图!一看就懂!

温馨提示:代码在文章末尾


基本思想:

快速排序算法通过多次比较和交换来实现排序,其排序流程如下:

(1)首先设定一个分界值(也就是基准),通过该分界值将数组分成左右两部分。

(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。

(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。

(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

漫画图解:

一、场景:对 6 1 2 7 9 3 4 5 10 8 这 10 个数进行排序
二、思路:
先找一个基准数(一个用来参照的数),为了方便,我们选最左边的 6,希望将 >6 的放到 6 的右边,<6 的放到 6 左边。
如:3 1 2 5 4 6 9 7 10 8
先假设需要将 6 挪到的位置为 k,k 左边的数 <6,右边的数 >6
(1)我们先从初始数列“6 1 2 7 9 3 4 5 10 8 ”的两端开始“探测 ”,先从右边往左找一个 <6 的数,再从左往右找一个 >6 的数,然后交换。我们用变量 i 和变量 j 指向序列的最左边和最右边。刚开始时最左边 i=0 指向 6,最右边 j=9 指向 8 ;

(2)现在设置的基准数是最左边的数,所以序列先右往左移动(j–),当找到一个 <6 的数5就停下来。
接着序列从左往右移动(i++),直到找到一个 >6 的数又停下来7;
(3)两者交换,结果:6 1 2 5 9 3 4 7 10 8;

(4)j 的位置继续向左移动(友情提示:每次都必须先从 j 的位置出发),发现 4 满足要求,接着 i++ 发现 9 满足要求,交换后的结果:6 1 2 5 4 3 9 7 10 8;

(5)目前 j 指向的值为 9,i 指向的值为 4,j-- 发现 3 符合要求,接着 i++ 发现 i=j,说明这一轮移动结束啦。现在将基准数 6 和 3 进行交换,结果:3 1 2 5 4 6 9 7 10 8;现在 6 左边的数都是 <6 的,而右边的数都是 >6 的,但游戏还没结束

(6)我们将 6 左边的数拿出来先:3 1 2 5 4,这次以 3 为基准数进行调整,使得 3 左边的数 ❤️,右边的数 >3,根据之前的模拟,这次的结果:2 1 3 5 4
(7)再将 2 1 抠出来重新整理,得到的结果: 1 2
(8)剩下右边的序列:9 7 10 8 也是这样来搞,最终的结果: 1 2 3 4 5 6 7 8 9 10 (具体看下图)

快速排序的每一轮处理其实就是将这一轮的基准数归位,当所有的基准数归位,排序就结束啦

动图演示

代码实现:

#include<iostream>
using namespace std;
int arr[100],n;//全局变量
void quicksort(int left,int right){int i,j,k,temp;if(left > right) return;temp = arr[left]; //先将基准数保存下来,这里选择左边为基准数i=left; j=right;while(i!=j){//先从右往左找,找到比基准数小的数while(arr[j] >= temp && i < j)j--;//再从左往右找,找到比基准数大的数while(arr[i] <= temp && i < j)i++;//如果是找到,而不是i和j相遇了,就交换他们的位置if(i < j){k=arr[i];arr[i]=arr[j];arr[j]=k;}}//退出时 i = j 此时将基准数和 i(或j)位置的数交换arr[left]=arr[i];arr[i]=temp;//交换完基准数后 继续处理左右的位置quicksort(left,i-1);quicksort(i+1,right);return;
}
int main(){int i;printf("数据个数:\n");scanf("%d",&n);printf("输入%d个数据:\n",n);for(i=0;i<n;i++)scanf("%d",&arr[i]);quicksort(0,n-1);printf("排序后的数据为:\n");for(i=0;i<n;i++)printf("%d ",arr[i]);printf("\n");return 0;
}

C/C++排序算法(4)快速排序相关推荐

  1. 十大排序算法之快速排序(两种方法)

    十大排序算法之快速排序 本文采用Java书写选择排序,其他语言类似可以借鉴着写 思想:在待排序序列中选择一个分割元素,将待排序序列中所有比分割元素关键字小的元素移动到分割元素左侧位置:将待排序序列中所 ...

  2. 排序算法之----快速排序(快速上手快速排序)

    排序算法之----快速排序(快速上手快速排序) 何为快速排序算法? 快速排序的基本思想又是什么? 其实很简单: 快速排序的基本思想是 1.先从数列中取出一个数作为基准数(这里我们的算法里面取数组最右边 ...

  3. php1到5000排序,常用的排序算法(一)--快速排序(PHP实现)

    常用的排序算法系列 快速排序 假设当前需要从小到大进行排序,快速排序的核心思路是,从当前数组中,找到一个元素作为基准比较值(key),分别从两个方向进行比较.从后往前找,比key小元素放在数组前面.然 ...

  4. 排序算法(5)快速排序

    排序算法(5)快速排序 思想:递归,分治法. 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边. 3.再对左右区间重复第二步,直到各区 ...

  5. 【排序算法】快速排序(C语言)

    [排序算法]-- 快速排序 目录 一.快速排序的单趟排序 1. 霍尔法 2. 挖坑法 3. 前后指针 二.快速排序 1. 排序步骤 2. 排序完整步骤图 3. 快速排序代码 3.1 递归实现 3.2 ...

  6. 快速排序算法_常用排序算法之快速排序

    点击上方蓝色 "铁匠学编程" 关注我,让我们一起学习! 前天给大家分享了归并排序,但是它不是原地排序算法,需要消耗额外的内存空间,今天给大家分享的是江湖无人不知无人不晓的" ...

  7. 排序算法-04快速排序(Python实现)

    快速排序 性质 一种基本的交换排序算法,比较常用的排序算法,简称快排. 基本的排序思路如下.基本思想为:通过一趟排序将要排序的数据分割成独立的两部分,分割点左边的数都比它小,分割点右边的数都比它大,然 ...

  8. 程序填充(指针):3数排序_排序算法之快速排序,它为什么这么快?

    本文将介绍排序算法中最常用,以及最重要的快速排序. 1 快速排序实例 快速排序由C. A. R. Hoare在1960年提出,是冒泡排序的一种改进.快速排序就跟它的名字一样,效率很快.跟冒泡排序,选择 ...

  9. 常用排序算法(二)快速排序

    快速排序 概要 本章介绍排序算法中的快速排序. 目录 1. 快速排序介绍 2. 快速排序图文说明 3. 快速排序的时间复杂度和稳定性 4. 快速排序实现 4.1 快速排序C实现 4.2 快速排序C++ ...

  10. 排序算法之快速排序详解

    一.算法介绍 快速排序:快速排序的基本思想是通过一次排序将等待的记录分成两个独立的部分,其中一部分记录的关键字小于另一部分的关键字.C部分的快速排序一直持续到整个序列被排序. 任取一个元素 (如第一个 ...

最新文章

  1. 线程的堆栈——Windows核心编程学习手札之十六
  2. GetDiskFreeSpace 和 GetDiskFreeSpaceEx
  3. 虚拟机中web服务器的搭建,虚拟机下搭建web服务器
  4. Mysql的drop/truncate/delete
  5. zookeeper配置
  6. java数组复制的方式和效率比较
  7. Linux学习笔记006-启动流程
  8. python简易停车系统
  9. jdk下载--操作系统
  10. 浅谈帆软报表的权限授权,以便于二次开发
  11. Flutter代码锦囊---自定义曲线裁剪
  12. UVA11729 Commando War【贪心】
  13. greensock下载_使用GreenSock构建可拖动的画布外菜单
  14. 各位大佬,Spark的重点难点系列暂时更新完毕
  15. 在类xx中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args)否则 JavaFX 应用程序类必须....
  16. 大部分erp系统都是java和.net甚至还有asp,为什么鲜有php的erp?
  17. 正确设置 php-fpm子进程用户 提高网站安全性 防止被挂木马
  18. GF(2)上任意阶本原多项式的生成—线性反馈移位寄存器
  19. Web前端之过渡与动画
  20. Altium Designer 20 (11)——封装的IPC创建

热门文章

  1. android webview的使用问题
  2. 错误913:未能找到ID为13的数据库。可能该数据库尚未激活,也可能正在转换过程中...
  3. Cisco3550三层交换机vlan间路由配置实例
  4. 微软ASP.NET AJAX框架剖析
  5. v-html可能导致的问题
  6. python3 协程 写法_理解Python的协程(Coroutine)
  7. Bootstrap3 弹出提示插件的方法
  8. Bootstrap两端对齐的按钮组
  9. 垂直布局的HTML表单
  10. shiro 同时实现url和按钮的拦截_shiro笔记 【四】