`
wind_bell
  • 浏览: 291269 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

排序--快速排序

阅读更多
快速排序利用分治策略

原理:
取数组中的一个值pivot做为基准值,对数组分治,小于pivot分为一组,大于pivot分为一组
递归对每个分组继续分组,直到分组中只有一个元素
主要包括两个步骤
1: 以一个基准值为中心,把数组分成两组
2: 对每个分组递归分组,直到分组元素只有一个

实现:
 private static int partition(int[] array, int low, int high)
 {
  int pivot = array[low];    //pivot可以为数组中的任何一个,只要将它与第一个交换即可
  while( low < high )
  {
   while( low < high && array[high] > pivot )
    high--;
   if ( low < high )
    array[low++] = array[high];
   while( low < high && array[low] <= pivot)
    low++;
   if ( low < high )
    array[high--] = array[low];
  }
  array[low] = pivot;
  return low;
 }
 public static void quickSort(int[] array, int low, int high)
 {
  int pivotPos;
  if ( low < high )
  {
   pivotPos = partition(array, low, high);
   quickSort(array, low, pivotPos - 1);
   quickSort(array, pivotPos + 1, high);
  }
 }

算法复杂度分析:
复杂度只要依赖于递归树的高度

平均情况下(即分组均匀,每个分组的元素大概为原数组的1/2时):递归树高度为O(nlogn)
因为对数组分组的操作需要O(n),此时复杂度为  O(nlogn)

最坏情况(数组有序,此时递归树退化为直线):树高度为O(n), 所以复杂度为O(n^2)

空间复杂度:(取决于递归层数)
同时间复杂度
平均: O(logn)
最坏: O(n)

稳定性:
快速排序为非稳定排序

优化:
由于基准值的选取直接关系到分组是否均匀,所以随机选择数组中的一个数做为pivot,然后将其和第一个元素交换
这样随机后,数组分组较为均匀
分享到:
评论

相关推荐

    快速排序 --- 非递归实现

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按...

    选择排序-插入排序-快速排序-冒泡排序

    本主题将详细探讨四种常见的排序算法:选择排序、插入排序、快速排序以及冒泡排序,它们都是用C语言实现的。以下是这些排序算法的详细解析: 1. **选择排序(Selection Sort)** - 选择排序是一种简单直观的排序...

    归并排序,排序等算法,数据结构,快速排序,链表排序

    本主题将深入探讨四种常见的排序算法:归并排序、快速排序以及与链表相关的排序方法。 首先,我们来讨论归并排序(Merge Sort)。这是一种基于分治策略的排序算法。归并排序将大问题分解为小问题,然后逐步合并这些...

    最快的排序算法 谁才是最强的排序算法:快速排序-归并排序-堆排序,排序算法数据结构

    但是,快速排序的实际执行时间却比堆排序更快,这是因为快速排序的 cache freundliness 比堆排序更好。 快速排序、堆排序和归并排序都是 O(nlogn) 的时间复杂度,但是它们的稳定性、辅助空间和 cache freundliness ...

    快速排序-算法报告.doc

    快速排序是一种高效的排序算法,由C.A.R. Hoare在1960年提出,它采用了分治(Divide and Conquer)策略。快速排序的基本思想是通过一趟排序将待排序的数据分割成两部分,其中一部分的所有数据都比另一部分的所有数据...

    算法设计与分析-1排序算法性能分析-冒泡/选择/插入/合并/快速排序-pre ppt

    快速排序由一个基准值(Pivot)划分,使得基准值左边的元素小于基准,右边的元素大于基准,然后递归地对左右两边的子序列进行快速排序。其平均时间复杂度同样是O(n log n),但最坏情况下为O(n^2),这通常发生在输入...

    Java代码-排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序中部分排序以及算法-贪心法

    Java代码-排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序中部分排序以及算法-贪心法,大家可以将源码下载下来进行学习,附带着注释和解释,有不理解的可以找博主一起探讨,共同...

    多线程排序---希尔排序、快速排序、堆排序

    快速排序的基本步骤包括选择一个基准元素,将数组分为两部分,一部分的元素都小于基准,另一部分的元素都大于基准,然后对这两部分分别进行快速排序。快速排序在平均和最好情况下的时间复杂度为O(nlogn),但最坏情况...

    冒泡排序---选择,插入和快速排序

    该算法的基本思想是:选择一个基准值,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归...

    快速排序-flash演示

    快速排序-flash演示 可自己输入数据.......

    快速排序-Pascal

    procedure qsort(l,r:longint); var k,t,i,j:longint; begin k:=(l+r)div 2; t:=a[k]; i:=l; j:=r; repeat

    经典排序算法源代码-插入排序-选择排序-冒泡排序

    通过阅读和实践这些代码,你可以深入理解排序算法的内部机制,为进一步学习更复杂的排序算法如快速排序、归并排序等奠定基础。同时,这些基础知识对于提升编程能力,优化数据处理效率,解决实际问题都有着重要作用。

    内部排序-快速和堆

    快速排序和堆排序是两种非常重要的内部排序算法,在计算机科学中有着广泛的应用。它们都是基于比较的排序方法,但各自有着独特的实现策略和性能特点。 快速排序由C.A.R. Hoare在1960年提出,其核心思想是分治法。...

    数据结构--快速排序C++源代码

    数据结构--快速排序C++源代码,自己编写调试,代码简单易懂,不长

    FPGA并行快速排序算法-位宽可设

    在本文中,我们将深入探讨基于FPGA的并行快速排序算法,特别关注“位宽可设”的特性。这种算法能够高效地处理大量数据,并且在硬件实现上具有很高的灵活性。我们将从以下几个方面来阐述这个主题: 一、快速排序算法...

    西南交通数据结构内部排序-多种排序算法的实现.docx

    本实验涉及了四种经典的内部排序算法:希尔排序、快速排序、堆排序和归并排序。 **希尔排序**(Shell Sort)是由希尔提出的,它是一种改进的插入排序。希尔排序的核心思想是将待排序的元素按照一定的间隔分组,对每...

    快速排序-算法.zip

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法(Divide and Conquer),通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的...

    快速排序 快速排序例子

    ### 快速排序知识点解析 #### 一、快速排序简介 快速排序是一种高效的排序算法,由英国计算机科学家托尼·霍尔(Tony Hoare)在1960年提出。它采用分治策略来把一个序列分为较小和较大的两个子序列,然后递归地...

    算法-理论基础- 排序- 快速排序(包含源程序).rar

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治策略,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再...

    算法设计实验报告-快速排序和归并排序

    本实验旨在通过对两种经典排序算法——快速排序和归并排序的研究与实现,深入理解它们的基本原理、时间复杂度,并通过编程实践比较这两种算法在不同数据规模下的性能表现。 #### 二、快速排序 **1. 基本思想** ...

Global site tag (gtag.js) - Google Analytics