- 浏览: 278609 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (161)
- 【**计划】 (2)
- 【**Core Java**】 (30)
- 【**JAVA EE】 (6)
- JDBC (3)
- Hibernate专题系列 (0)
- 【**OS】 (14)
- 【**架构设计/设计模式】 (11)
- 【Hadoop】 (3)
- 【**分布式】 (9)
- 模板 (1)
- C (2)
- 常用工具 (1)
- Oracle (2)
- 【Tips】 (3)
- 【数据库】 (2)
- 玩转Ubuntu (0)
- 【计算机网络/网络编程】 (7)
- 【**Search Engine】 (21)
- 【**专题**】 (6)
- 【**Python】 (10)
- XML (1)
- 【**Open Source Framework】 (1)
- 【高级主题】 (1)
- 【存储】 (3)
- 【笔试面试】 (2)
- 【**数据结构与算法设计】 (20)
- 【其他】 (3)
- 【编程练习】 (2)
- 【待完成】 (12)
- 【工作】 (6)
- 【软件研发】 (4)
- 【**多线程多进程编程】 (5)
- 【Web Service】 (1)
- 【表达式解析/JavaCC系列】 (5)
- 【缓存系统:Memcached】 (1)
- 【Java IO/NIO】 (5)
- 【JVM运行机制及内存管理】 (7)
最新评论
-
107x:
...
python list排序 -
yuzhu223:
...
【Python基础】Python的lambda函数与排序 -
Tonyguxu:
分析查询结果的打分小于11.query=1065800715* ...
lucene打分机制的研究 -
Tonyguxu:
query=139320661963.013709 = (MA ...
lucene打分机制的研究 -
Tonyguxu:
query=10658007150.6772446 = (MA ...
lucene打分机制的研究
前言
快速排序(Quick Sort)算法是 “递归+分治”算法一个很好的应用。
算法思想
快速排序是找出一个元素(理论上可以随便找一个 注1)作为基准值(pivot),然后对数组进行分区操作:找到基准点——使基准点左边元素的值都不大于基准值,基准点右边的元素值都不小于基准值,找到基准点后就可以将基准值放到基准点上,这样在该基准点左边的值都小于右边的值,基准点两边为两个分区。递归体现为,对前个阶段产生的分区再找基准点产生了分区再找基准点...直到分区中只有一个元素为止或者说所有元素都排好序为止。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。
注1 基准位置不同的影响?
名词:基准值和基准点
基准值一般选择某partition的第一个元素。
该partition的基准点是这样一个点:在该partition中,该点左边的所有元素不大于点右边的元素。
基准点是分区的依据。
算法演示
2 8 7 1 3 5 6 4
i-> <-j
(找大)
(找小)
这里找大和找小都是与i和j位置上的数与基准值比较
一、j
j找第一个小于2的元素1,1赋给(覆盖重置)i所指元素2
得到:
1 8 7 3 5 6 4
i j
二、i
i找到第一个大于2的元素8,8赋给(覆盖重置)j所指元素(NULL<-8)
1 7 8 3 5 6 4
i <-j
三、j
j继续左移,在与i碰头之前,没有找到比2小的元素,结束。
最后,主元2补上。
第一趟快排结束之后,数组变成:
1 2 7 8 3 5 6 4
第二趟,
7 8 3 5 6 4
i-> <-j
(找大) (找小)
一、j
j找到4,比主元7小,4赋给7所处位置
得到:
4 8 3 5 6
i-> j
二、i
i找比7大的第一个元素8,8覆盖j所指元素(NULL)
4 3 5 6 8
i j
4 6 3 5 8
i-> j
i与j碰头,结束。
第三趟:
4 6 3 5 7 8
......
以下,分析原理,一致,略过。
最后的结果,如下图所示:
1 2 3 4 5 6 7 8
算法实现
两个函数Partition和QuickSort。Partition负责分区(或者说寻找某分区的基准点)。QuickSort负责递归,将某个区再分区,直到一个分区只有一个元素为止。
在某个分区中找基准点过程中,分别有指针从分区头和尾向中间移动,R指针向左移动,寻找小于基准值的位置,如果小于基准值则停止左移,将该位置上的值赋给L指针所在位置。然后,L指针右移,寻找大于基准值的位置,如果大于基准值则停止右移,将该位置上的值赋给R指针所在位置,然后再由R指针左移。。直达R指针遇到L 指针为止。此时L指针所指位置即为要寻找的基准点。
//begin :一个parttition的起始点,end :partition的结束点 //return :该partition的基准点 int Partition(int array[],int begin,int end){ int privot = array[begin]//基准值 int L = begin; int R = end; while(L < R){ while(R > L && array[R] > privot) R--; array[L] = array[R]; while(R > L && array[L] < privot) L++; array[R] = array[L]; } array[L] = privot;//将基准值放到基准点 return L; } void QuickSort(int array[],int begin,int end){ int privot; while(begin < end){ privot = Partition(array,begin,end); QuickSort(array,privot+1,end); //递归 QuickSort(array,begin,privot-1); } }
性能分析
相关应用
参考阅读
1. http://www.cnblogs.com/zabery/archive/2011/07/27/2118353.html
再研究下性能分析部分
2. http://jsdo.it/norahiko/oxIy/fullscreen
多个排序算法的演示
3.JDK Arrays.sort(int[])对快排的优化
http://hxraid.iteye.com/blog/665095
4.完整的文章
http://blog.csdn.net/v_JULY_v/article/details/6116297
发表评论
-
LRU算法介绍
2012-06-05 22:30 3750问题背景 在操作系统的内存管理里,如何节省有限的内存并为尽可 ... -
数据结构之位图bitmap
2012-05-10 23:12 0http://dongxicheng.org/structur ... -
常见数据结构与算法汇总
2012-05-10 23:01 11091、常见数据结构 线性:数组,链表,队列, ... -
数据结构之位图
2012-05-10 18:34 5666介绍 (20120511)位图就是通过将数组下标与应用中 ... -
CRC循环校验
2012-05-10 15:11 1371http://www.360doc.com/content/1 ... -
map3搜索与存储的一道面试题
2012-05-10 15:10 926假设一个mp3搜索引擎收录了2^24首歌曲,并记录了可收听这些 ... -
字符串匹配算法——Edit distance
2012-05-09 11:20 2552如何比较两个字符串之间的相似程度(或者差异)? 想要比较 ... -
排序算法
2012-04-21 23:06 690插入排序 shell排序 ... -
【编程珠矶】开篇 千万号码的排序问题
2012-04-21 12:52 942注:学习了《编程珠矶》第一章,将涉及的一些知识点整理如下 ... -
WXXR LRUList的实现
2012-03-01 16:01 778LRUList -
【专题】分治递归+排序算法
2012-03-01 11:47 730123 -
【排序】merge排序
2012-02-28 09:59 892前言 主要学习 http://en.wikipedia.or ... -
算法类博客推荐
2012-02-24 18:17 6471. http://blog.csdn.net/v_J ... -
递归与分治
2012-02-24 18:16 1008分治与递归基本思想 分治:分治强调“分 ... -
Apache LRUMap实现
2012-02-23 13:10 1111源码是 org.apache.commons.collect ... -
WXXR LRUMap的实现
2012-02-22 18:33 1889前言 实现LRU算法,注意观察者模式、并发(读写锁、线程池) ... -
【专题】LRU
2012-02-22 16:21 1530包含如下内容: 一. LRU算法 ht ... -
LRU理论
2012-02-21 18:46 10391.LRU算法介绍 LRU是Least Rec ... -
【排序算法】冒泡排序(bubble sort)
2012-02-19 12:16 0问题描述 将一组乱序的整形按照由小到大排序 算法思路 经 ... -
【Core Java】并发集合
2012-02-02 17:05 1140并发容器与同步容器 ...
相关推荐
快速排序快速排序 快速排序 快速排序 快速排序 快速排序
本文将深入探讨四种在C++中实现的常见排序算法:插入排序、冒泡排序、堆排序和快速排序。这些算法各有特点,适用于不同的场景,理解并掌握它们对于提升编程能力至关重要。 1. **插入排序**: 插入排序是一种简单的...
直接插入排序 选择排序 堆排序 归并排序 快速排序 冒泡排序等七种排序方法
"C语言学习之排序数据结构链表堆排序希尔排序快速排序递归排序" 本资源主要介绍了C语言中的排序算法,包括链表、堆排序、希尔排序、快速排序和递归排序等五种方法。同时,文章还提供了每种排序方法的原理、流程图和...
本主题将深入探讨四种常见的排序算法:堆排序、快速排序以及两种未在标题中明确提到但同样重要的排序方法——基数排序和计数排序。 首先,让我们详细了解一下堆排序。堆排序是一种基于比较的排序算法,利用了数据...
10个数据结构课程设计实例二叉树建立遍历冒泡排序快速排序等10个数据结构课程设计实例二叉树建立遍历冒泡排序快速排序等10个数据结构课程设计实例二叉树建立遍历冒泡排序快速排序等 10个数据结构课程设计实例二叉树...
基本排序气泡排序插入排序快速排序双通道快速排序三通道快速排序堆排序.zip
C语言数据结构课程设计实例二叉树建立遍历冒泡排序快速排序等 C语言数据结构课程设计实例二叉树建立遍历冒泡排序快速排序等 C语言数据结构课程设计实例二叉树建立遍历冒泡排序快速排序等 C语言数据结构课程设计实例...
基于c语言10个数据结构课程设计实例二叉树建立遍历冒泡排序快速排序等 基于c语言10个数据结构课程设计实例二叉树建立遍历冒泡排序快速排序等 基于c语言10个数据结构课程设计实例二叉树建立遍历冒泡排序快速排序等 ...
本资源包"选择排序 冒泡排序 插入排序 快速排序 堆排序.zip"聚焦于五种经典的排序算法,包括选择排序、冒泡排序、插入排序、快速排序以及堆排序。这些算法的实现语言是Objective-C,这是一种强大的面向对象的编程...
二叉树建立遍历冒泡排序快速排序算法:C语言编程实现10个数据结构课程设计实例.zip 二叉树建立遍历冒泡排序快速排序算法:C语言编程实现10个数据结构课程设计实例.zip 二叉树建立遍历冒泡排序快速排序算法:C语言...
常见的经典排序算法有希尔排序、二分插入法、直接插入法、带哨兵的直接排序法、冒泡排序、选择排序、快速排序、堆排序等。 一、希尔排序(Shell 排序法) 希尔排序法,又称宿小增量排序,是 1959 年由 D.L.Shell ...
### 快速排序知识点解析 #### 一、快速排序简介 快速排序是一种高效的排序算法,由英国计算机科学家托尼·霍尔(Tony Hoare)在1960年提出。它采用分治策略来把一个序列分为较小和较大的两个子序列,然后递归地...
直接插入排序、冒泡排序、快速排序、直接选择排序、堆排序和二路归并排序是计算机科学中经典的排序算法,它们在数据处理和算法学习中占有重要地位。这些排序算法各有特点,适用场景不同,下面将逐一详细介绍,并结合...
插入排序 并归排序 桶排序 快速排序这些算法书上的经典算法,给出了算法过程,可供测试实际运行效率或者学习算法本身
选择排序、插入排序和快速排序都是经典的排序算法,各有其特点和适用场景。接下来,我们将详细探讨这三个排序算法。 1. **选择排序(Selection Sort)** 选择排序是一种简单直观的排序算法。它的基本思想是在未...
不错的练手C语言课程设计例子--10个数据结构课程设计实例、二叉树建立遍历冒泡排序快速排序等 不错的练手C语言课程设计例子--10个数据结构课程设计实例、二叉树建立遍历冒泡排序快速排序等 不错的练手C语言课程设计...
本文将深入探讨三种常见的高效排序算法:堆排序、快速排序和归并排序。它们都是基于不同的原理和策略,具有各自的优势和适用场景。 首先,堆排序是一种基于比较的排序算法,利用了二叉堆的数据结构。二叉堆是一个...
排序算法汇总P: 冒泡排序快速排序直接选择排序插入排序希尔排序 堆排序........
实现以下常用的内部排序算法并进行性能比较:"直接插入排序"," 折半插入排序"," 2—路插入排序"," 表插入排序"," 希尔排序"," 起泡排序"," 快速排序"," 简单选择排序"," 树形选择排序"," 堆排序"," 归并排序"," 链式...