【任务目标】

将一组大规模无序数组变为有序

【快速排序原理】

  1. 在数组中随机选择一个数作为基准数temp,
  2. 在数组中从后往前找一个比temp小的数lo,交换lo和temp
  3. 在数组中从前往后找一个比temp大的数hi,交换temp和hi
  4. 重复2、3找lo和hi,直到找不到这样的数lo,hi。此时temp左边的数都<=它,右边的数都>=它。此时temp所在位置就是数组有序后其应该在的位置
  5. 将temp左边的数看做一个无序数组,重复步骤1-4,又会得到一个新的temp
  6. 将temp右边的数看做一个无序数组,重复步骤1-4,又会得到一个新的temp
  7. 得到新的temp后再重复步骤5、6,直到temp左边和右边都没有无序数组了,此时整个数组有序

将上述步骤转换为程序语言时,有些地方要注意:

  1. 在步骤2,3中,temp的位置在不停地被交换,只有在步骤4中找到位置时才确定其所在。而在程序中把temp取出,相当于空出来一个位置,把接下来要和temp交换的位置处的数值赋值给这个空位置即可。
  2. 在步骤2中从后往前找,实际上就是数组索引从最大值不断减小找;在步骤3中从前往后找,实际上就是数组索引从最小值不断增大来找
  3. 步骤5,6中的左边无序数组的索引最小值就是当前数组的最小值,最大值是temp所在位置索引减1;右边无序数组的索引最小值是temp所在位置索引加1,最大值是当前数组的最大值
  4. 步骤5-7显然是要递归

【快速排序原理概括】

通过不断比较将小数前移大数后移来将随机选取的基准数放置在其在有序数组中应该在的位置,通过递归调用将不断地把随机选取的基准数放置在其所在数组有序时应该在的位置。

【代码实现】

using System;namespace Sort
{class Program{static void Main(string[] args){int[] A = new int[30];Random ra = new Random();for (int i = 0; i < 30; i++){A[i] = ra.Next(200);}Program ps = new Program();ps.QuickSort(A,0,A.Length-1);Console.WriteLine("排序结果:");foreach (int a in A){Console.Write(a + " ");}bool isSorted = true;for (int i = 0; i < A.Length - 1; i++){if (A[i] > A[i + 1])isSorted = false;}Console.Write(isSorted);Console.ReadKey();}public void QuickSort(int[] A,int lo,int hi){if (lo > hi)//递归退出条件{return;}int i = lo;int j = hi;int temp = A[i];//取得基准数,空出一个位置while (i<j)//当i=j时推出,表示temp左边的数都比temp小,右边的数都比temp大{while (i<j&&temp<=A[j])//从后往前找比temp小的数,将比temp小的数往前移{j--;}A[i] = A[j];//将比基准数小的数放在空出的位置,j的位置又空了出来while (i<j&&temp>=A[i])//从前往后找比temp大的数,将比temp大的数往后移{i++;}A[j] = A[i];//将比基准数大的数放在hi空出来的位置,如此,i所在的位置又空了出来}A[i] = temp;QuickSort(A,lo,i-1);//对lo到i-1之间的数再使用快速排序,每次快速排序的结果是找到了基准数应该在的位置//其左边的数都<=它,右边的数都>=它,它此时在数组中的位置就是排序好时其应该在的位置。QuickSort(A,i+1,hi);//对i+1到hi之间的数再使用快速排序}}
}

【实现结果】

【快速排序改进】

1.虽然文中说基准数可以随机选取,但在代码时对递归调用时的每个无序数组选取的都是其第一个元素。你当然也可以选择中间的元素,temp=A[(lo+hi)/2]即可。面对不同的数据,具体怎么来选择这个随机基准数没有特定的方法。一般就取第一个元素或中间元素即可。

随机基准数选取的不好,可能出现这样的结果(以选取第一个元素为例):比较了一圈发现,基准数只向后移动了两三位就到了其应在位置。那么其左边的无序数组很小,右边的无序数组很大。在为右边的无序数组选择的基准数找位置时,要找很多次。这就增加了计算时间。最好是每次为基准数找好位置时,其位置为当前数组的最中间,那样左右两边的无序数组大小相同。

2.不断递归调用时,当前的无序数组规模是在不断减小的,当规模减小到一定程度可以用插入排序代替快速排序。插入排序在小规模数据中排序速度更快。

排序算法C#实现之快速排序详解相关推荐

  1. 九大排序算法-C语言实现及详解

    概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大, ...

  2. 排序算法——冒泡排序原理动图详解及实现

    主要涉及的是内部排序  交换排序   => 冒泡排序   快速排序  选择排序   直接选择排序   堆排序  插入排序   直接插入排序   希尔排序  归并排序 冒泡排序 1. 简介 冒泡排 ...

  3. 常用排序:冒泡排序与快速排序详解,看完这篇就够了!风马博客

    常用排序:冒泡排序与快速排序详解. 在排序算法中,冒泡排序和快速排序可以算是排序算法入门必会的两种排序了,今天和大家来分析一下如何快速理解并掌握这两种排序.首先冒泡排序是初学者最常用的排序,所以我们先 ...

  4. python 快速排序 详解_数据结构与算法:快速排序(原理讲解+python实现)

    快速排序 快速排序是一种基于分治法(Divide and Conquer)的排序算法 它之所以称为快速排序是因为它的平均时间复杂度为O(nlogn),最坏情况下是O(n2) 但是这样的情况不常见 一般 ...

  5. 第28课:彻底解密Spark Sort-Based Shuffle排序具体实现内幕和源码详解

    第28课:彻底解密Spark Sort-Based Shuffle排序具体实现内幕和源码详解 本文根据家林大神系列课程编写 http://weibo.com/ilovepains 为什么讲解Sorte ...

  6. 分治算法小结(附例题详解)

    分治算法小结(附例题详解) 我的理解: 分治算法我的理解就是看人下菜碟,我们要解决的问题就好像一群人构成的集体,要我们解决这个问题,那我们就要满足这群人里面每个人不同的需求,也就是写出解决的代码,把每 ...

  7. c语言将AOE网络的数据写入TXT文档中,数据结构与算法学习辅导及习题详解.张乃孝版-C/C++文档类资源...

    数据结构与算法学习辅导及习题详解.张乃孝版.04年10月 经过几年的努力,我深深体会到,编写这种辅导书要比编写一本湝通教材困难得多. 但愿我的上述理想,在本书中能够得以体现. 本书的组织 本书继承了& ...

  8. python 快速排序详解

    python 快速排序详解 快速排序函数 def partition(arr,low,high): i = ( low-1 ) #最小元素<索引>pivot = arr[high] #选取 ...

  9. EMD算法之Hilbert-Huang Transform原理详解和案例分析

    目录 Hilbert-Huang Transform 希尔伯特-黄变换 Section I 人物简介 Section II Hilbert-Huang的应用领域 Section III Hilbert ...

最新文章

  1. Spring boot 集成工作流flowable去掉xml配置
  2. ACM旗舰期刊最新综述:一览端到端人脸识别最新进展
  3. Linux之提高Nginx的安全性:受限server_tokens /user_agents/buffer_size/连接数/请求方法/外链/不用模块 使用日志/TLS/HTTPS/升级
  4. 详解Bitmap之ARGB_8888/RGB_565/ALPHA_8/ARGB_4444
  5. SAP 电商云 Accelerator 和 Spartacus UI 的工作机制差异
  6. 九度OJ 题目1011:最大连续子序列
  7. 无法启动程序因为计算机中丢失礼包,Win10开机提示“计算机中丢失mfc110u.dll”的解决方法...
  8. zabbix在ubuntu16.04上的安装
  9. python策略模式包含角色_Python 之策略模式
  10. 【手写数字识别】基于matlab GUI BP神经网络手写数字识别系统【含Matlab源码 1639期】
  11. 最全的软件开发报价标准
  12. c语言怎么设置命令行字体大小,C语言入门教程-命令行参数
  13. UnionPay-银联支付-netcore(一)
  14. 【数据库】浅析Innodb的聚集索引与非聚集索引
  15. AN APPROACH OF VECTOR FIELD TEXTURE VISUALIZATION BASED ON FIELD DRIVEN STRENGTH算法实现
  16. pdf 旋转视图,为啥不能保存?
  17. MFC之学习扇形绘制与绘制阴阳鱼图
  18. 程序物语(八):我心戚戚
  19. 1-C语言 8皇后问题 (For循环解法)
  20. TensorFlow北大公开课学习笔记-8 复现vgg16并实现图片识别

热门文章

  1. [论文总结] Genecology and Adaptation of Forest Trees 林木的基因生态学与适应性
  2. 众安保险笔试java
  3. 助记词创建以太坊钱包源码_技术指南 | 以太坊钱包开发:生成账户地址、私钥、keystore、助记词...
  4. matlab里rad23是什么意思,镭延迟符合计数器(RaDeCC)测量海水中的
  5. 【笔记总结】高中生物——【必一 Ⅰ】走近细胞
  6. 用jQuery如何获取复选框的值
  7. (转)设置漂亮的Eclipse主题(Theme)风格
  8. YOLOV5源码的详细解读
  9. c#如何合并多个word文档中的内容到一个word中
  10. 安⽐(SECBIT)实验室携⼿路印(Loopring)共同发布智能合约风险列表