`
zy19982004
  • 浏览: 661896 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
F6f66edc-1c1a-3859-b76b-a22e740b7aa7
Hadoop学习
浏览量:251950
社区版块
存档分类
最新评论

数据结构与算法学习五:快速排序

 
阅读更多

一. 排序方法

  1. 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
  2. 分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。原排序数组data[0...n]。
    1. 分解:在data[low..high]中任选一个记录作为基准(pivot),以此基准将当前无序区划分为左、右两个较小的子区间data[low..pivotpos-1]和data[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录pivot,右边的子区间中所有记录的关键字均大于等于pivot,而基准记录pivot则位于正确的位置(pivotpos)上,它无须参加后续的排序。
    2. 递归:data[low..high]被划分为两个子区间data[low..pivotpos-1)和data[pivotpos+1..high],而每个子区间采用相同的方法再次划分为两个子区间...
    3. 组合:因为当"求解"步骤中的两个递归调用结束时,其左、右两个子区间已有序。对快速排序而言,"组合"步骤无须做什么,可看作是空操作。

 

二. 动画演示

     http://student.zjzk.cn/course_ware/data_structure/web/flashhtml/kuaisupaixu.htm

 

三.Java代码  

	/**
	 * 快速排序
	 * @param data
	 * @param low data最小下标
	 * @param high data最大下标
	 * @return
	 */
	public static int[] quickSort(int[] data, int low, int high) {
		// 对data[low..high]快速排序
		int pivotpos; // 划分后的基准记录的位置
		if (low < high) {// 仅当区间长度大于1时才须排序
			pivotpos = partition(data, low, high); // 对data[low..high]做划分
			quickSort(data, low, pivotpos - 1); // 对左区间递归排序
			quickSort(data, pivotpos + 1, high);// 对右区间递归排序
		}
		return data;
	}

	/**
	 * 划分算法,划分后
	 * 左边子区间中所有记录的关键字均小于等于基准记录pivot
	 * 右边的子区间中所有记录的关键字均大于等于pivot
	 * 基准记录pivot则位于正确的位置上
	 * @param data
	 * @param i
	 * @param j
	 * @return
	 */
	public static int partition(int[] data, int i, int j) {
		// 并返回基准记录的位置
		int pivot = data[i]; // 用区间的第1个记录作为基准 ,
		while (i < j) { // 从区间两端交替向中间扫描,直至i=j为止
			while (i < j && data[j] >= pivot) {
				// pivot相当于在位置i上
				j--; // 从右向左扫描,查找第1个关键字小于pivot的记录data[j]
			}
			if (i < j) // 表示找到的data[j]的关键字<pivot
				data[i++] = data[j]; // 相当于交换data[i]和data[j],交换后i指针加1

			while (i < j && data[i] <= pivot) {
				// pivot相当于在位置j上
				i++; // 从左向右扫描,查找第1个关键字大于pivot的记录data[i]
			}
			if (i < j) // 表示找到了R[i],使data[i]>pivot
				data[j--] = data[i]; // 相当于交换data[i]和data[j],交换后j指针减1
		} // endwhile
		data[i] = pivot; // 基准记录已被最后定位
		return i;
	}
 

 

四. 时间复杂度和稳定性

  1. 最好时间复杂度
    1. 在最好情况下,每次划分所取的基准都是当前无序区的"中值"记录,划分的结果是基准的左、右两个无序子区间的长度大致相等。总的关键字比较次数:
      0(nlogn)
  2. 最坏时间复杂度
    1. 最坏情况是数组有序时,每次划分选取的基准都是当前无序区中关键字最小(或最大)的记录,划分的结果是基准左边的子区间为空(或右边的子区间为空),而划分所得的另一个非空的子区间中记录数目,仅仅比划分前的无序区中记录个数减少一个。
      因此,快速排序必须做n-1次划分,第i次划分开始时区间长度为n-i+1,所需的比较次数为n-i(1≤i≤n-1),故总的比较次数达到最大值:
      Cmax = n(n-1)/2=O(n2 )
  3. 平均时间复杂度
    1. 0(nlogn)
  4. 算法的空间复杂度:快速排序在系统内部需要一个栈来实现递归。若每次划分较为均匀,则其递归树的高度为O(lgn),故递归后需栈空间为O(lgn)。最坏情况下,递归树的高度为O(n),所需的栈空间为O(n)。
  5. 快速排序是非稳定的,例如[2,2 ,1]。
分享到:
评论

相关推荐

    数据结构、算法与应用:C++语言描述

    《数据结构、算法与应用:C++语言描述》是一本专为计算机科学和技术领域的学生以及专业人士编写的经典教材。本书的核心目标是通过C++编程语言,深入浅出地讲解数据结构、算法及其在实际问题中的应用。以下是该书可能...

    c语言 数据结构 快速排序算法

    c语言版本的数据结构的快速排序算法,适用于新手学习

    数据结构算法与应用-C++语言描述_Sahni著

    《数据结构算法与应用-C++语言描述》这本书,由Sahni著,旨在帮助读者深入理解这些核心概念,并通过C++实践来提升技能。 本书可能涵盖了以下几个主要的知识点: 1. **基础数据结构**:包括数组、链表、栈、队列、...

    java数据结构与算法.pdf

    - **八大排序算法**:包括冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序、希尔排序和计数排序。每种算法都有其特定的应用场景和效率特点。 4. **查找算法**: - **哈希表**:通过哈希函数快速定位...

    数据结构与算法学习资料

    总结来说,"数据结构与算法学习资料"是计算机科学的核心组成部分,涵盖了各种数据组织方式和解决问题的方法。通过深入学习,我们可以更好地理解和解决实际问题,提升编程技能,为未来的软件开发和系统设计打下坚实...

    数据结构与算法分析:Java语言描述

    数据结构与算法分析是计算机科学的核心领域之一,它主要研究如何高效地组织和处理数据,以及设计和分析解决计算问题的算法。在《数据结构与算法分析:Java语言描述》一书中,作者深入探讨了这一领域的关键概念和技术...

    数据结构与算法分析--C语言描述_数据结构与算法_

    数据结构与算法是计算机科学的基础,对于理解和设计高效的软件至关重要。C语言因其高效、底层特性,常被用于实现数据结构和算法,使得程序更接近硬件,性能更优。本资源"数据结构与算法分析--C语言描述"是针对数据...

    JS数据结构与算法.pdf

    JS 数据结构与算法.pdf 本书主要介绍了 JavaScript 语言的基础知识,包括数据结构和算法。以下是该书的详细知识点: 一、JavaScript 基础知识 * 变量和数据类型 * 运算符和控制结构 * 函数和对象 * 数组和字符串 ...

    数据结构与算法学习网站

    数据结构与算法是计算机科学的基础...通过上述资源,你可以系统地学习数据结构与算法,不断积累实践经验,提升编程能力。记住,理解和掌握数据结构与算法是提升编程技能的关键步骤,也是通往高级软件工程师之路的基石。

    数据结构与算法分析–C++描述(第3版,WEISS著,含习题答案)

    《数据结构与算法分析——C++描述》是Mark Allen Weiss教授撰写的一本经典教材,针对计算机科学中的核心主题——数据结构和算法进行了深入浅出的阐述。这本书的第三版不仅涵盖了基本的数据结构如数组、链表、栈、...

    数据结构实验-排序算法

    排序算法则是数据结构中的重要部分,它们用于对一组数据进行有序排列。在这个实验中,我们将关注六种不同的排序算法:选择排序、冒泡排序、插入排序、基数排序以及快速排序和归并排序。下面是对这些排序算法的详细...

    数据结构与算法学习

    数据结构与算法是计算机科学的基础,对于任何编程...总的来说,数据结构与算法是计算机科学的基石,通过系统学习和实践,你可以提高编程技能,为成为优秀的IT专业人士打下坚实的基础。记住,持续学习和不断实践是关键。

    数据结构与算法分析C++语言描述第四版参考答案

    《数据结构与算法分析C++语言描述第四版》是一本深度探讨数据结构和算法的经典教材。这本书由Mark Allen Weiss撰写,旨在帮助读者理解和掌握如何在C++编程环境中有效地设计和实现数据结构及算法。第四版更新了内容,...

    数据结构与算法分析:C语言描述_原书第2版_高清带书签DPF

    《数据结构与算法分析:C语言描述》是计算机科学领域的一本经典著作,由Mark Allen Weiss撰写,旨在深入探讨数据结构和算法,并采用C语言作为实现工具。这本书的第二版在原有基础上进行了更新和改进,增加了更多的...

    “数据结构与算法”课程学习总结报告

    《“数据结构与算法”课程学习总结报告》 在学习“数据结构与算法”这门课程时,我们深入了解了线性结构、树结构和图结构中的数据表示与处理方法。这些知识是计算机科学中的基石,对于高效编程和优化至关重要。课程...

    数据结构算法与应用:C++语言描述的书本及习题答案.zip )

    《数据结构算法与应用:C++语言描述》这本书旨在深入浅出地介绍数据结构的基本概念、设计原理以及C++中的实现方式,并结合习题来帮助读者巩固理解和提高实践能力。 本书首先会讲解基本的数据结构,如数组、链表、栈...

    数据结构和算法的学习:一些常见的算法包括排序(如冒泡排序、快速排序等)、搜索(如二分搜索、深度优先搜索等)、图算法

    一些常见的算法包括排序(如冒泡排序、快速排序等)、搜索(如二分搜索、深度优先搜索等)、图算法(如Dijkstra算法、Prim算法等)等。在生产环境中,数据结构和算法的应用非常广泛。例如,你可能需要使用特定的数据...

    数据结构与算法 课后答案

    以下是对标题“数据结构与算法 课后答案”以及描述“数据结构与算法(C++版)参考答案、 数据结构、算法”的详细解释和相关知识点的阐述。 首先,我们来谈谈数据结构。数据结构是组织、存储和管理数据的方式,它...

    数据结构与算法java—作者:周鹏

    《数据结构与算法Java》是由周鹏编著的一本深入探讨数据结构与算法的书籍,主要面向Java开发者。这本书详细地介绍了数据结构和算法的基础知识,对于提升编程能力,优化程序设计有着重要的指导意义。 首先,我们要...

Global site tag (gtag.js) - Google Analytics