原理

快速排序(Quicksort)是对冒泡排序的一种改进。

  1. 从数列中挑出一个元素,称为"基准"(pivot);
  2. 排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在本次排序退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

例子

将无序数组[3,6,4,2,5,1]进行快速排序

1),先把第一项[3]取出来作为基准依次与其余项进行比较(3出列后大喝一声,比我小的站前边,比我大的站后边,行动吧!霸气侧漏~),

如果比[3]小就放[3]前边,2 1都比[3]小,全部放到[3]前边

如果比[3]大就放[3]后边,6 4 5比[3]大,全部放到[3]后边,

一趟排完后变成下边这样:

排序前:3,6,4,2,5,1

排序后:2,1,3,6,4,5

2),对前面一半[2,1]继续进行快速排序

重复步骤1)后变成下边这样:

排序前:2,1

排序后:1,2

前面一半排序完成,总的数组为:

排序前:2,1,3,6,4,5

排序后:1,2,3,6,4,5

3),对后面一半[6,4,5]继续进行快速排序

重复步骤1)后变成下边这样:

排序前:6,4,5

排序后:4,5,6

后面一半排序完成,总的数组为:

排序前:1,2,3,6,4,5

排序后:1,2,3,4,5,6

至此,排序结束

动画演示

代码参考

     static void Main(string[] args)
{
int[] intArray = { , , , , , };
Quick_Sort(intArray, , intArray.Length - ); foreach (var item in intArray)
{
Console.WriteLine(item);
}
Console.ReadLine();
} // 快速排序
static void Quick_Sort(int[] unsorted, int low, int high)
{
int loc;
if (low < high)
{
loc = partition(unsorted, low, high);
Quick_Sort(unsorted, low, loc - );
Quick_Sort(unsorted, loc + , high);
}
} /// <summary>
/// 分区操作
/// </summary>
/// <param name="unsorted">带排序数组</param>
/// <param name="low">起始位置</param>
/// <param name="high">结束位置</param>
/// <returns>排序后基准所在位置</returns>
static int partition(int[] unsorted, int low, int high)
{
int pivot = unsorted[low]; // 基准
while (low < high)
{
while (low < high & unsorted[high] > pivot) high--;
unsorted[low] = unsorted[high]; while (low < high & unsorted[low] <= pivot) low++;
unsorted[high] = unsorted[low];
}
unsorted[low] = pivot;
return low;
}

参考资料

维基百科http://en.wikipedia.org/wiki/Quicksort

基础算法之快速排序Quick Sort的更多相关文章

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

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

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

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

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

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

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

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

  5. 快速排序Quick sort

    快速排序Quick sort 原理,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归 ...

  6. 排序算法 - 快速排序(Quick Sort)

    算法思想 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). (1) 分治法的基本思想  ...

  7. 快速排序算法回顾 --冒泡排序Bubble Sort和快速排序Quick Sort(Python实现)

    冒泡排序的过程是首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换,然后比较第二个记录和第三个记录的关键字.以此类推,直至第n-1个记录和第n个记录的关键字进行过比较为止 ...

  8. 交互设计算法基础(3) - Quick Sort

    int pivotIndex, pivot, swapIndex; void swap(int[] arr, int x, int y) { int temp = arr[x]; arr[x] = a ...

  9. java基础算法之快速排序

    快速排序(Quicksort)是对冒泡排序的一种改进.在大学学过之后现在基本忘了,最近在好多地方都看到说快速排序在面试会问到,于是自己也准备重新拾起以前忘记的东西来,慢慢的积累自己的基础知识.figh ...

随机推荐

  1. Shellcode编程小技巧

    工作需要,需要注入其他程序监控一些东西,检测到的数据通过WM_COPY 消息发送给显示窗体.(大体是这样的还没定稿) ##1 选择一个框架 ## tombkeeper/Shellcode_Templa ...

  2. 通过正则表达式实现简单xml文件解析

    这是我通过正则表达式实现的xml文件解析工具,有些XHTML文件中包含特殊符号,暂时还无法正常使用. 设计思路:常见的xml文件都是单根树结构,工具的目的是通过递归的方式将整个文档树装载进一个Node ...

  3. loadrunner总体使用篇

    为什么要进行性能测试呢?  有些问题是只有在大并发或者压力测试下才会暴露出来的,在平常的公司内部测试中,感觉一切都是正常的,但是把服务放到生产线上,例如某个时刻突然有很多的用户要向我们的服务发送请求, ...

  4. 史上最详cxf-Springmvc-maven实现webservice教程(转)

    虽知道webservice,工作两年一直没使用过,最近不忙趁机研究了下,实现了简单的服务端及客户端调用.鉴于慕课网没有webservice的教程,大多又都是学生,就在这里跟大家分享下,内容比较详细.大 ...

  5. Android 上下文对象

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40481055,本文出自:[张鸿洋的博客] 1.Context概念 其实一直想写一 ...

  6. Java 网络编程学习总结

    新手一枚,Java学习中,把自己学习网络编程的知识总结一下,梳理下知识,方便日后查阅,高手莫进. 本文的主要内容: [1]    网络编程认识                [2]  TCP/IP编程 ...

  7. Bar codes in NetSuite Saved Searches(transport/reprint)

    THIS IS A COPY FROM BLOG Ways of incorporating Bar Codes into your Netsuite Saved Searches.    Code ...

  8. bash中使用mysql中的update命令

    mysql -uroot -ppasswd -e "update tbadmin set sPassword ='************' where sUserName='admin'& ...

  9. [OC] 图片平铺

    Tip: self.bgImg.image = [self.bgImg.image resizableImageWithCapInsets:UIEdgeInsetsMake(100, 40, 40, ...

  10. 利用PhantomJS进行网页截屏,完美解决截取高度的问题

    关于PhantomJS PhantomJS 是一个基于WebKit的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS ...