快速排序利用分治策略
原理:
取数组中的一个值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,然后将其和第一个元素交换
这样随机后,数组分组较为均匀
- 浏览: 291269 次
- 性别:
- 来自: 广州
最新评论
-
lliiqiang:
关键在于业务也正确,数据格式只是一种声明协议
XML验证 -
koubi1986:
你好!请教一些问题:请问一下1。你是如何把nutch抓取到的二 ...
Nutch应用 -
juda:
你的希尔排序有问题, for( int i = d; i & ...
排序--插入排序 -
hamlzf:
这个例子很不错
JProfiler学习笔记 -
白色熊猫:
应该下面还有啊 ,看不到啊 麻烦贴出来下 谢谢了
多线程编程 高级主题(二)注:转
相关推荐
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按...
本主题将详细探讨四种常见的排序算法:选择排序、插入排序、快速排序以及冒泡排序,它们都是用C语言实现的。以下是这些排序算法的详细解析: 1. **选择排序(Selection Sort)** - 选择排序是一种简单直观的排序...
本主题将深入探讨四种常见的排序算法:归并排序、快速排序以及与链表相关的排序方法。 首先,我们来讨论归并排序(Merge Sort)。这是一种基于分治策略的排序算法。归并排序将大问题分解为小问题,然后逐步合并这些...
但是,快速排序的实际执行时间却比堆排序更快,这是因为快速排序的 cache freundliness 比堆排序更好。 快速排序、堆排序和归并排序都是 O(nlogn) 的时间复杂度,但是它们的稳定性、辅助空间和 cache freundliness ...
快速排序是一种高效的排序算法,由C.A.R. Hoare在1960年提出,它采用了分治(Divide and Conquer)策略。快速排序的基本思想是通过一趟排序将待排序的数据分割成两部分,其中一部分的所有数据都比另一部分的所有数据...
快速排序由一个基准值(Pivot)划分,使得基准值左边的元素小于基准,右边的元素大于基准,然后递归地对左右两边的子序列进行快速排序。其平均时间复杂度同样是O(n log n),但最坏情况下为O(n^2),这通常发生在输入...
Java代码-排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序中部分排序以及算法-贪心法,大家可以将源码下载下来进行学习,附带着注释和解释,有不理解的可以找博主一起探讨,共同...
快速排序的基本步骤包括选择一个基准元素,将数组分为两部分,一部分的元素都小于基准,另一部分的元素都大于基准,然后对这两部分分别进行快速排序。快速排序在平均和最好情况下的时间复杂度为O(nlogn),但最坏情况...
该算法的基本思想是:选择一个基准值,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归...
快速排序-flash演示 可自己输入数据.......
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++源代码,自己编写调试,代码简单易懂,不长
在本文中,我们将深入探讨基于FPGA的并行快速排序算法,特别关注“位宽可设”的特性。这种算法能够高效地处理大量数据,并且在硬件实现上具有很高的灵活性。我们将从以下几个方面来阐述这个主题: 一、快速排序算法...
本实验涉及了四种经典的内部排序算法:希尔排序、快速排序、堆排序和归并排序。 **希尔排序**(Shell Sort)是由希尔提出的,它是一种改进的插入排序。希尔排序的核心思想是将待排序的元素按照一定的间隔分组,对每...
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法(Divide and Conquer),通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的...
### 快速排序知识点解析 #### 一、快速排序简介 快速排序是一种高效的排序算法,由英国计算机科学家托尼·霍尔(Tony Hoare)在1960年提出。它采用分治策略来把一个序列分为较小和较大的两个子序列,然后递归地...
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治策略,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再...
本实验旨在通过对两种经典排序算法——快速排序和归并排序的研究与实现,深入理解它们的基本原理、时间复杂度,并通过编程实践比较这两种算法在不同数据规模下的性能表现。 #### 二、快速排序 **1. 基本思想** ...