快速排序算法C#实现

最近想把几大经典的排序算法系统的整理过一遍,写下笔记,算是复习吧!!

1、快速排序。

  快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列——来自百度百科。

  假设我们要对数组Array 6  7  2  1  9  4  3  10  5  8排序,先在序列中找任意一个数(此例取第一个)作为基准数(就是一界限,大于此数放序列的右边小于或等于放左边)

下标

0

1

2

3

4

5

6

7

8

9

6

7

2

1

9

4

3

10

5

8

初始化:i=0,j=9,基准数 X=6

从j开始往前找一个小于或等于X的数,

当j=8时,Array [0] = Array[8](i++),数组变为:

下标

0

1

2

3

4

5

6

7

8

9

5

7

2

1

9

4

3

10

5

8

从i开始往后找一个比X大的数,

当i=1时,Array[8]= Array[1](j--),数组变为:

下标

0

1

2

3

4

5

6

7

8

9

5

7

2

1

9

4

3

10

7

8

从j开始往前找一个小于或等于X的数,

当j=6时,Array[1]= Array[6](i++),数组变为:

下标

0

1

2

3

4

5

6

7

8

9

5

3

2

1

9

4

3

10

7

8

从i开始往后找一个大于X的数,

当i=4时,Array[6]= Array[4] (j--),数组变为:

下标

0

1

2

3

4

5

6

7

8

9

5

3

2

1

9

4

9

10

7

8

从j开始往前找一个小于或等于X的数,

当j=5时,Array[4]= Array [5] (i++),数组变为:

下标

0

1

2

3

4

5

6

7

8

9

5

3

2

1

4

4

9

10

7

8

当i==j==5时,停止循环,将基准数填入,Array[5]=X,数组变为:

下标

0

1

2

3

4

5

6

7

8

9

5

3

2

1

4

6

9

10

7

8

此次循环结束后,可以看出,Array[5]左边的数据都比它小,右边的数都比它大,因此再对Array [0…4] 和Array [6…9]重复上述步骤即可(递归调用)。

C#代码实现:

 1  static void Main(string[] args)
 2 {
 3      int[] array = new[] {6, 7, 2, 1, 9, 4, 3, 10, 5, 8};
 4      Sort(array, 0, array.Length - 1);
 5      foreach (int item in array)
 6      {
 7          Console.Write(item + " ");
 8       }
 9         Console.ReadLine();
10   }

      /// <summary>/// 排序/// </summary>/// <param name="array">要排序的数组</param>/// <param name="low">下标开始位置,向右查找</param>/// <param name="high">下标开始位置,向左查找</param>public static void Sort(int[] array, int low, int high){if (low >= high)return;//完成一次单元排序int index = SortUnit(array, low, high);//递归调用,对左边部分的数组进行单元排序Sort(array, low, index - 1);//递归调用,对右边部分的数组进行单元排序Sort(array, index + 1, high);}/// <summary>/// 单元排序/// </summary>/// <param name="array">要排序的数组</param>/// <param name="low">下标开始位置,向右查找</param>/// <param name="high">下标开始位置,向右查找</param>/// <returns>每次单元排序的停止下标</returns>public static int SortUnit(int[] array, int low, int high){int key = array[low];//基准数while (low < high){//从high往前找小于或等于key的值while (low < high && array[high] > key)high--;//比key小开等的放左边array[low] = array[high];//从low往后找大于key的值while (low < high && array[low] <= key)low++;//比key大的放右边array[high] = array[low];}//结束循环时,此时low等于high,左边都小于或等于key,右边都大于key。将key放在游标当前位置。 array[low] = key;return high;}

posted on 2017-01-11 09:42 我爱广州小蛮腰 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/homeforhzw/p/6272439.html

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

  1. 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/

    大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...

  2. 快速排序算法实现思想个人理解

    一.概述 快速排序是冒泡排序的改进算法.它也是通过不断比较和移动交换来实现排序的,只不过它的实现增大了记录的比较和移动的距离,将关键字较大的元素从前面直接放到后面,关键字较小的元素直接从后面放到前面, ...

  3. 快速排序算法(基于Java实现)

    title: 快速排序算法(基于Java实现) tags: 快速排序算法 快速排序算法的原理与代码实现: 一.快速排序算法的原理 快排算法的思想是: 如果需要排序数组中下标从p到r之间的一组数据,我们 ...

  4. java sort算法名称_快速排序算法(Quick Sort)(java)

    /** * 快速排序算法是基于分治策略的一种排序算法,下面是一个递归的快速排序. * @author liuy */ public class QuickSort { public static vo ...

  5. 【算法】快速排序算法的编码和优化

    参考资料 <算法(第4版)>          - - Robert Sedgewick, Kevin Wayne <啊哈! 算法>              - - 啊哈磊 ...

  6. Quick Sort 快速排序算法

    Table of Contents 前言 算法步骤 选取枢纽元 分割数组 算法实现 小数组和插入排序 结语 前言 快速排序算法应该是常见的排序算法中使用的最多的一个,很多语言内置的排序算法都间接或直接 ...

  7. 排序算法系列:快速排序算法

    概述 在前面说到了两个关于交换排序的算法:冒泡排序与奇偶排序. 本文就来说说交换排序的最后一拍:快速排序算法.之所以说它是快速的原因,不是因为它比其他的排序算法都要快.而是从实践中证明了快速排序在平均 ...

  8. 快速排序算法_基于位运算的快速排序算法

    前言 如果你准备看这篇文章,我就当你是懂快速排序算法原理的. 下面是我在2018年10月3日想到的基于二进制位运算对正整数进行的一种快速排序算法,目前的代码只能对正整数进行有效的排序,当然,稍微修改一 ...

  9. 【图文解释】快速排序算法

    高快省的排序算法 有没有既不浪费空间又可以快一点的排序算法呢?那就是"快速排序"啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对"6  1  2 7  9  3   ...

最新文章

  1. caxa电子图板2018中文版
  2. matlab eeg信号处理,EEG数据信号的Matlab滤波仿真设计分析研究
  3. windows系统和linux系统可以使用相同的js代码吗_使用Sboxr自动发现和利用DOM(客户端)XSS漏洞...
  4. 【英语学习】【WOTD】cerebral 释义/词源/示例
  5. linux uucp 改为 root,ubuntu 10.04 /etc目录下找不到vsftpd.user_list和vsfepd.ftpusers两个文件?...
  6. 第三次小组实践作业小组每日进度汇报:2017-12-2
  7. 原创engine中地块的自动编号函数
  8. Qt-textEdit 滚顶条设置只读模式
  9. HTTP和HTTPS及 Fiddler抓包原理
  10. HTML5 网站大观:15个精美的 HTML5 作品集网站实例
  11. 邮件群发软件哪个好用?
  12. php有没有ispostback,php用什么表示IsPostBack?
  13. 萤石云谷歌禁用flash_mac chrome屏蔽flash插件怎么办 mac chrome flash启用方法
  14. 获取股票交易数据的Tushare的使用方法
  15. js如何取到ajax回调函数值,js怎样获取调用回调函数的参数值
  16. char、int、long它们各占几个字节?占几位?
  17. Android学习之ImageView放置gif动态图
  18. 黑洞大作战游戏架构设计与实现
  19. 为了搞清楚类加载,竟然手撸JVM!
  20. lua 自实现pairs

热门文章

  1. 速冻果蔬青麦源品牌-农业大健康·李喜贵:谋定功能性技术
  2. 国际农产品市场谋定特点趋势 对话国际农民丰收节贸易会
  3. Python:名片管理系统
  4. Nginx, HTTPS的配置
  5. 解决文字与下划线重叠的问题
  6. Ribbon_窗体_实现Ribbon风格的窗体
  7. App推广中如何寻找200个以上渠道
  8. 短视频Gif快手-有点意思 | 手摸手产品研究院
  9. PMCAFF | 产品经理如何设计敏捷开发流程?
  10. 18条交互设计和心理学之间的奇妙联系