快速排序法一窥

快速排序法作为一种分治法的算法,和归并排序法的差别在于,前者是先比较,后拆分,而后者是先拆分,在合并的过程中进行比较。

快速排序法在原理上简单总结就是:

切分:

  1. 拿数组第一个数(也可以是随机任意一个)作为中心点(pivot);
  2. 扫描其它所有数,将小于这个中心点的数归类到左边,大于中心点的归类到右边;
  3. 将左边(右边)的所有数字递归第一步,一直分叉;

合并:

当数组只有一个数的时候,递归结束,开始返回,每次返回都在中心点左右合并。

这里拿网上找来的一段PHP代码进行解释:

<?php
set_time_limit(10);
function quicksort($seq) {
  if (count($seq) > 1) {
    $k = $seq[0];
    $x = array();
    $y = array();

    for ($i=1; $i<count($seq); $i++) {  //从第二个元素开始扫描
      if ($seq[$i] <= $k) {
        $x[] = $seq[$i];  //归类到左边
      } else {
        $y[] = $seq[$i];  //归类到右边
      }

    }

    $x = quicksort($x);  //左边继续进行排序
    $y = quicksort($y);  //右边继续进行排序

    return array_merge($x, array($k), $y); //递归逐层回溯的时候,进行merge动作

  }else{
    return $seq;  //递归终点,开始逐层返回数组

  }

}

$arr = array(12,2,16,30,8,28,4,10,20,6,18);
print_r(quicksort($arr));
?

还在网上看到一些改进版的快排算法,比如说前后来回扫描进行填坑,以避免单边数组量过大,但是原理是一样的,都是基于pivot.

这里给出wikipedia上的演示图和算法复杂度,看上去会更加直观形象。

使用快速排序法對一列數字進行排序的過程

分類 排序算法
數據結構 不定
最差時間複雜度
最優時間複雜度
平均時間複雜度
最差空間複雜度 根據實現的方式不同而不同

快速排序法一窥

时间: 2024-08-05 17:58:59

快速排序法一窥的相关文章

归并排序算法一窥

归并排序法是一个基于分治法的比较排序方法,其最差情况复杂度为O(nlogn),而快速排序法的复杂度在最差情况下达到O(n2) 本文使用PHP来讨论其算法过程: 假设对乱序数列进行排序 $input = array(11,5,1,4,8,7,9,2); 思路可以表示:(图是PPT画的,比较简单,请看官见谅) 进行递归二分,拆成最小组合,2个数: 逐层返回,每次返回都进行合并比较: 比较的过程如下 贴上PHP代码: 1 <?php 2 $input = array(11,5,1,4,8,7,9,2)

【经典算法大全】收集51种经典算法 初学者必备

<经典算法大全>是一款IOS平台的应用.里面收录了51种常用算法,都是一些基础问题.博主觊觎了好久,可悲哀的是博主没有苹果,所以从网上下了老奔的整理版并且每个都手敲了一遍. 虽然网上也有博客贴了出来,但是自己写写感觉总是好的.现在分享个大家. 代码和运行结果难免有出错的地方,请大家多多包涵. 1.河内之塔(汉诺塔) 2.费式数列 3.巴斯卡三角形 4.三色棋 5.老鼠走迷宫(1) 6.老鼠走迷宫(2) 7.骑士走棋盘 8.八皇后 9.八枚银币 10.生命游戏 11.字串核对 12.双色河内塔,

三种快速排序以及快速排序的优化

一.  快速排序的基本思想 快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小.之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的. 二.  快速排序的三个步骤 1) 选择基准:在待排序列中,按照某种方式挑出一个元素,作为 "基准"(pivot): 2) 分割操作:以该基准在序列中的实际位置,把序列分成两个子序列.此时,在基准左边的元素都比该基准小,在基准右边的元素都比基准大: 3) 递归地对两个序列进行快速排序,直到

再说快速排序

快速排序作为排序算法中的战斗机,一直是排序算法里面用的最多也是考的最多的一个算法 已经证明,对n个元素进行排序,最优的算法也是需要NLogN的时间复杂度,而快速排序的时间复杂度就是NlogN, 所以快速排序是排序算法中最优算法中的一个,下面我们继续来探索一下神奇的快速排序算法吧 快速排序的核心思想:每次排序把每一个元素k移动到正确的位置,并且把小于k的元素都移动到k的左边,大于k的元素都移动到k的右边 待排序的数列x[],长度为n 算法一:初始化k=x[m](m为待排序的第一个元素),对于每一个

经典排序算法--快速排序

一.快速排序的基本思想: 快速排序使用了分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小.之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的. 二.快速排序的三个步骤 1) 选择基准:在待排序列中,按照某种方式挑出一个元素,作为 "基准"(pivot): 2) 分割操作:以该基准在序列中的实际位置,把序列分成两个子序列.如果为升序,则此时,在基准左边的元素都比该基准小,在基准右边的元素都比基准大:而基准则在排序后正确的位置上.

【C/C++】快速排序的两种实现思路

方法一:不断填坑,一次确定一个值.http://blog.csdn.net/morewindows/article/details/6684558 #include<stdio.h> void qsort(int *array, int len) { int value, start, end; if (len <= 1) return; value = array[0]; start = 0; end = len - 1; while (start < end) { for (;

【转】三种快速排序算法以及快速排序的优化

一.  快速排序的基本思想 快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小.之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的. 二.  快速排序的三个步骤 1) 选择基准:在待排序列中,按照某种方式挑出一个元素,作为 “基准”(pivot): 2) 分割操作:以该基准在序列中的实际位置,把序列分成两个子序列.此时,在基准左边的元素都比该基准小,在基准右边的元素都比基准大: 3) 递归地对两个序列进行快速排序,直到序列为空或

148 Sort List 链表上的归并排序和快速排序

在使用O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 详见:https://leetcode.com/problems/sort-list/description/ 方法一:归并排序 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class

JavaScript 数据结构与算法之美 - 归并排序、快速排序、希尔排序、堆排序

1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习. 之所以把归并排序.快速排序.希尔排序.堆排序放在一起比较,是因为它们的平均时间复杂度都为 O(nlogn). 请大家带着问题:快排和归并用的都是分治思想,递推公式和递归代码也非常相似,那它们的区别在哪里呢 ? 来阅读下文. 2. 归并排序(Merge Sort) 思想 排序一个数