码迷,mamicode.com
首页 > 编程语言 > 详细

快速排序

时间:2015-05-13 21:19:42      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序n个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n)算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。

步骤为:

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

个人觉得快速排序给初学者最大的意义就是它分治法的思想。在程序设计过程中也是经常用到。像Microsoft,tencent等知名企业的面试笔试中也是常常提及快速排序。

 

下面是快排的动态图:

技术分享

分类 排序算法
数据结构 不定
最差时间复杂度 技术分享
最优时间复杂度 技术分享
平均时间复杂度 技术分享
最差空间复杂度 根据实现的方式不同而不同

C代码:

本实现的空间复杂度是O(n)。这样难免及会有较多的内存移动操作,但同时节省了空间,如果不希望过多的内存移动操作,可以额外申请内存来实现。

 1 void quick_sort(int src[] , int len)
 2 {
 3     if( len <= 1 ) return;
 4     int pivot = 0;
 5     //确定分治的基数
 6     for( int n = 0 ; n < len ; n++){
 7         if( src[pivot] > src[n] ){
 8             int swap = src[n];
 9             for( int m = n ; m >pivot ; m-- ){
10                 src[m] = src[m-1]; 
11             }
12             src[pivot] = swap;
13             pivot++;
14         }
15     }
16     //递归处理
17     quick_sort(src,pivot);
18     quick_sort(src+pivot+1,len-pivot-1);
19 }


处理过程:

技术分享

 

快速排序

标签:

原文地址:http://www.cnblogs.com/jvane/p/4494638.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!