1. // --------------------------------------------------------------------------------------------------------------------
  2. //
  3. //
  4. // Respect the work.
  5. //
  6. // </copyright>
  7. // <summary>
  8. //
  9. // The quick sort.
  10. //
  11. // 高速排序(QuickSort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据切割成独立的两部分,当中一部分的全部数据都比另外一部分的全部数据要小,然后再按此方法对这两部分数据分别进行高速排序。整个排序过程能够递归进行,以此达到整个数据变成有序序列。
  12. //
  13. // 设要排序的数组是a[0]...a[N-1],首先随意选取一个数据(通常选用数组的首元素)作为重要数据,然后将全部比它小的数都放到它的前面,全部比它大的数都放到它的后面,这个过程称为一趟高速排序。

    值得注意的是,高速排序不是一种稳定的排序算法。也就是说,多个同样的值的相对位置或许会在算法结束时产生变动。

  14. // 一趟高速排序的算法是:
  15. // 1)设置两个变量i、j,排序開始的时候:i=0,j=N-1。
  16. // 2)以数组首元素作为重要数据,赋值给pivot,即pivot=a[0]。
  17. // 3)从j開始向前搜索,即由后開始向前搜索(j--),找到第一个小于pivot的值a[j],将a[j]赋值给a[i];
  18. // 4)从i開始向后搜索,即由前開始向后搜索(i++),找到第一个大于pivot的值a[i],将a[i]赋值给a[j];
  19. // 5)反复第3、4步,直到i==j;(在3、4步中。若没找到符合条件的值,即3中a[j]不小于pivot,4中a[i]不大于pivot的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。

    若找到符合条件的值,进行替换的时候i、j指针位置不变。

  20. //
  21. // 高速排序的平均时间复杂度是:O(nlog<sub>2</sub>n)。
  22. //
  23. // </summary>
  24. // --------------------------------------------------------------------------------------------------------------------
  25. namespace CSharpLearning
  26. {
  27. using System;
  28. /// <summary>
  29. /// The program.
  30. /// </summary>
  31. public static class Program
  32. {
  33. /// <summary>
  34. /// The main.
  35. /// </summary>
  36. public static void Main()
  37. {
  38. int[] a = { 101, 93, 856, 7, 62, 15, 84, 3, 298, 1256 };
  39. Console.WriteLine("Before Quick Sort:");
  40. foreach (int i in a)
  41. {
  42. Console.Write(i + " ");
  43. }
  44. Console.WriteLine("\r\n");
  45. Console.WriteLine("In Quick Sort:");
  46. QuickSort(a, 0, 9);
  47. Console.WriteLine("\r\nAfter Quick Sort:");
  48. foreach (int i in a)
  49. {
  50. Console.Write(i + " ");
  51. }
  52. Console.WriteLine(string.Empty);
  53. }
  54. /// <summary>
  55. /// 高速排序。
  56. /// </summary>
  57. /// <param name="a">
  58. /// 待排序数组。
  59. /// </param>
  60. /// <param name="low">
  61. /// 待排序数组的排序起始位置。
  62. /// </param>
  63. /// <param name="high">
  64. /// 待排序数组的排序终止位置。
  65. /// </param>
  66. private static void QuickSort(int[] a, int low, int high)
  67. {
  68. if (low >= high)
  69. {
  70. return;
  71. }
  72. int pivot = QuickSortOnce(a, low, high);
  73. // 输出每一次排序。
  74. foreach (int i in a)
  75. {
  76. Console.Write(i + " ");
  77. }
  78. Console.WriteLine(string.Empty);
  79. // 对枢轴的左端进行排序。

  80. QuickSort(a, low, pivot - 1);
  81. // 对枢轴的右端进行排序。
  82. QuickSort(a, pivot + 1, high);
  83. }
  84. /// <summary>
  85. /// 一趟高速排序。

  86. /// </summary>
  87. /// <param name="a">
  88. /// 待排序数组。

  89. /// </param>
  90. /// <param name="low">
  91. /// 待排序数组的排序起始位置。
  92. /// </param>
  93. /// <param name="high">
  94. /// 待排序数组的排序终止位置。
  95. /// </param>
  96. /// <returns>
  97. /// 返回枢轴的位置。
  98. /// </returns>
  99. private static int QuickSortOnce(int[] a, int low, int high)
  100. {
  101. // 将首元素作为枢轴。
  102. int pivot = a[low];
  103. int i = low, j = high;
  104. while (i < j)
  105. {
  106. // 从右到左,寻找首个小于pivot的元素。

  107. while (a[j] >= pivot && i < j)
  108. {
  109. j--;
  110. }
  111. // 运行到此,j一定指向从右端起首个小于或等于pivot的元素。运行替换。
  112. a[i] = a[j];
  113. // 从左到右,寻找首个大于pivot的元素。

  114. while (a[i] <= pivot && i < j)
  115. {
  116. i++;
  117. }
  118. // 运行到此。i一定指向从左端起首个大于或等于pivot的元素。

    运行替换。

  119. a[j] = a[i];
  120. }
  121. // 退出while循环,运行至此,必然是i==j的情况。i(或j)指向的即是枢轴的位置,定位该趟排序的枢轴并将该位置返回。
  122. a[i] = pivot;
  123. return i;
  124. }
  125. }
  126. }
  127. // Output:
  128. /*
  129. Before Quick Sort:
  130. 101 93 856 7 62 15 84 3 298 1256
  131. In Quick Sort:
  132. 3 93 84 7 62 15 101 856 298 1256
  133. 3 93 84 7 62 15 101 856 298 1256
  134. 3 15 84 7 62 93 101 856 298 1256
  135. 3 7 15 84 62 93 101 856 298 1256
  136. 3 7 15 62 84 93 101 856 298 1256
  137. 3 7 15 62 84 93 101 298 856 1256
  138. After Quick Sort:
  139. 3 7 15 62 84 93 101 298 856 1256
  140. */

算法 quick sort的更多相关文章

  1. 快速排序算法 quick sort的理解

    最近做了一下算法的一些练习,感觉基础薄弱了,只是用一些已经有的东西来完成练习如quickSort(c++使用的时候是sort(起始位置,终止位置,比较函数),这个需要加头文件),但是不知道怎么推出来, ...

  2. 快速排序算法 Quick sort

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4046189.html 首先随机选择一个轴,并调整数组内各个数字,使得比轴值大的数在轴的右边, ...

  3. [算法]——快速排序(Quick Sort)

    顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ...

  4. 基础排序算法之快速排序(Quick Sort)

    快速排序(Quick Sort)同样是使用了分治法的思想,相比于其他的排序方法,它所用到的空间更少,因为其可以实现原地排序.同时如果随机选取中心枢(pivot),它也是一个随机算法.最重要的是,快速排 ...

  5. 经典排序算法 - 高速排序Quick sort

    经典排序算法 - 高速排序Quick sort 原理,通过一趟扫描将要排序的数据切割成独立的两部分,当中一部分的全部数据都比另外一部分的全部数据都要小,然后再按此方法对这两部分数据分别进行高速排序,整 ...

  6. Java中的经典算法之快速排序(Quick Sort)

    Java中的经典算法之快速排序(Quick Sort) 快速排序的思想 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对 ...

  7. 排序算法—快速排序(Quick Sort)

    快速排序(Quick Sort) 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序. ...

  8. 【算法】快速排序(Quick Sort)(六)

    快速排序(Quick Sort) 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序. ...

  9. [算法] 快速排序 Quick Sort

    快速排序(Quick Sort)使用分治法策略. 它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分:其中一部分的所有数据都比另外一部分的所有数据都要小.然后,再按此方法对这 ...

随机推荐

  1. Morton Code

    莫顿码 ,实现了一维与二维(或多维)的转换.它通过交叉存储两个数的位产生一个数,即莫顿码. 可以应用于为一个整数对产生一个唯一索引. 例如,对于坐标系中的坐标点使用莫顿编码生成的莫顿码,可以唯一索引对 ...

  2. mysql数据库维护(备份和还原)和性能提高

    为了有效防止数据丢失,并将损失降到最低,应对数据库服务器做维护.数据库维护,包括数据备份,还原,导出和导入操作. 1. MySQL数据库备份 所谓数据库维护,主要包含备份数据,还原数据和数据库迁移,对 ...

  3. phpstorm failed to create jvm:error code -6 解决办法 解决方法

    phpStorm 软件打开运行提示 failed to create JVM的解决办法. 修改文件 D:\Program Files (x86)\JetBrains\PhpStorm 7.1.3\bi ...

  4. (转)实现AI中LOD优化技术

    LOD(Level Of Detail)是3D渲染中用到的概念,按照wikipedia上的翻译,可以译为“细节层次”,它是一种根据与观察点的距离,来减低物体或者模型的复杂度来提升渲染效率的优化技术,因 ...

  5. 微软 Windows 10 将支持 8 英寸以下 ARM 平板设备

    2015 年 1 月 24 日,  9:32 下午 - 微软本周展示了 Windows 10 一系列新的改变,也包括首次公开展示的 Windows 10 手机版,但 ARM 平板并没有得到太多提及. ...

  6. 【pyhon】nvshens图片批量下载爬虫1.01

    # nvshens图片批量下载爬虫1.01 # 原先版本在遇到网络故障时回下载不全,这回更改了模式使得下载不成就重新下载,直到全部下载完毕 from bs4 import BeautifulSoup ...

  7. 从主机系统向虚拟机系统里面copy 文件

    从主机系统向虚拟机系统里面copy 文件: 一:请确保你的虚拟机里面安装了 VMTools 1:安装VMTools 2: 进入虚拟机系统里面,如果没有自动运行 VMtool安装程序,请打开我的电脑,手 ...

  8. [原创-性能调优]借助AWR报告分析解决oracleCPU过高的问题

    简介:在oracle数据库中,有两个非常实用的自带监控工具EM(Enterprise Manager)和AWR(Automatic Workload Repository).其中,通过AWR报告可以生 ...

  9. 解决在sdk manager中更新文件后出现This Android SDK requires Android Developer Toolkit version 23.1的错误

    起因:在sdksdk manager中更新了adt及其它的支持库后,eclipse报错:This Android SDK requires Android Developer Toolkit vers ...

  10. sqlconnection 调用webservice服务

    package cn.itcast.service.urlconnection; import java.io.InputStream; import java.io.OutputStream; im ...