`
wx1568520008
  • 浏览: 20422 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

如何优化冒泡排序和快排?

 
阅读更多

冒泡排序的优化: 1:加入哨兵 2:记住每一次交换的最后位置,该位置以后的为有序,不需要改变。






快排的优化:
	1.当待排序序列的长度分割到一定大小后,使用插入排序。原因:对于很小和部分有序的数组,快排不如插排好。当待排序列的长度分割到一定大小后, 继续分割的效率比插入排序要差,此时可以使用插排而不是快排。

	2.在一次分割结束后,可以把与Key相等的元素聚在一 起,继续下次分割时,不再对与key相等元素分割。具体过程:在处理过程中,会有两个步骤:
 第一步,在划分过程中,把与key相等元素放入数组的两端。
 第二步,划分结束后,把与key相等的元素移到枢轴周围。

	3.三数取中:中轴数的选取:最佳的划分是将待排序的序列分成等长的子序列,最佳的状态我们可以使用序列的中间的值,也就是第N/2个数。可是,这很难算出来,并且会明显减慢快速排序的速度。这样的中值的估计可以通过随机选取三个元素并用它们的中值作为枢纽元而得到。事实上,随机性并没有多大的帮助,因此一般的做法是使用左端、右端和中心位置上的三个元素的中值作为枢纽元。显然使用三数中值分割法消除了预排序输入的不好情形,并且减少快排大约14%的比较次数。

	4.优化递归操作
快排函教在函数尾都有两次递归操作,我们可以对其使用尾递归优化。
优点:如果待排序的序列划分极端不平衡,递归的深度将趋近于n,而栈的大小是很有限的,每次递归调用都会耗费一定的栈空间,函数的参数越多,每次递归耗费的空间也越多。优化后,可以缩减堆栈深度,由原来的O(n)缩减为logn。

概括:这里效率最好的快排组合是:三数取中+插排+聚集相等元素,它和STL中的Sort函数效率差不多。






转载于:https://my.oschina.net/u/4167465/blog/3076875

分享到:
评论

相关推荐

    冒泡排序 快排 堆排序 的c++实现

    这里我们主要探讨三种经典的排序算法:冒泡排序、快速排序和堆排序,并且它们都是使用C++语言实现的。这些排序算法各有特点,适用于不同的场景。 **冒泡排序**: 冒泡排序是一种简单直观的排序算法,它重复地遍历要...

    希尔排序,冒泡排序,堆排序等各种排序算法

    例如,当处理小规模数据或部分有序的数据时,插入排序和冒泡排序可能更合适;而处理大规模数据时,快速排序和堆排序则表现出更好的性能。了解并熟练掌握这些排序算法,对于提升编程技能和解决实际问题具有重要意义。...

    冒泡、快排、插入、合并、选择排序算法集锦

    ### 冒泡、快排、插入、合并、选择排序算法集锦 #### 一、冒泡排序 **原理概述:** 冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的...

    各动态图示排序算法(冒泡、快排、堆排)

    本项目以Qt库为平台,用C++语言实现了三种常见的排序算法:冒泡排序、快速排序和堆排序。以下是对这些算法的详细解释: **冒泡排序(Bubble Sort)** 冒泡排序是一种简单直观的排序算法,它重复地遍历要排序的数列...

    C语言排序全集:归并排序;基数排序;快速排序;冒泡排序;选择排序;折半排序;希尔排序

    C语言所有排序大全,解决了您日常上课考试学习的需要,在这里每一个程序都没有错误,其中压缩包包括了归并排序;...冒泡排序;选择排序;折半排序;希尔排序这些日常排序,因为是全集所以大家踊跃下载

    选择排序、冒泡排序、快速排序、折半查找

    选择排序和冒泡排序适合初学者理解排序的基本原理,而快速排序则在实际应用中表现出较高的效率。折半查找则在处理有序数据时展现出高效性。理解并熟练掌握这些基础算法,对于提升编程技能和解决问题的能力有着极大的...

    六种内部排序算法比较:直接插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序。

    例如,直接插入排序和冒泡排序适合小规模数据,而快速排序和堆排序则适用于大规模数据。选择排序和希尔排序在某些特定条件下也能展现出较高的效率。在实际应用中,我们需要根据数据的特性、内存限制以及时间效率要求...

    C++ 排序 算法 快排 冒泡 希尔 堆排

    本篇文章将详细探讨C++中常见的几种排序算法:快速排序、冒泡排序、选择排序以及堆排序。 1. **快速排序(Quick Sort)** 快速排序是一种高效的分治算法,由C.A.R. Hoare于1960年提出。它的基本思想是选取一个基准...

    常用排序算法的java实现(冒泡、插入、选择、希尔、归并、快排)

    这些排序算法各有优缺点,如冒泡排序和插入排序简单但效率较低,适用于小规模数据;选择排序和希尔排序在特定情况下有较好的性能;归并排序和快速排序则在大多数情况下都能提供较高的效率,尤其是快速排序,是实际...

    VC++冒泡排序动态演示

    总的来说,这个项目结合了C++编程、MFC库和冒泡排序算法,提供了一个交互式的教学工具,帮助初学者理解排序算法和MFC应用开发。通过这样的实践,开发者不仅能够掌握冒泡排序的实现,还能学习到如何在C++环境中利用...

    直接插入排序/快速排序/选择排序/冒泡排序(详细实现算法和性能比较)

    数据结构---直接插入排序/快速排序/选择排序/冒泡排序(详细实现算法和性能比较)

    排序方法(插入、冒泡、快排)

    本文将详细讨论三种常见的排序算法:插入排序、冒泡排序和快速排序,并结合Java编程语言来阐述它们的实现原理。 **插入排序**是一种简单直观的排序算法。它的工作原理类似于我们平时整理扑克牌的过程,每次取一张未...

    几种经典排序算法,包括快速排序、冒泡排序、选择排序和堆排序

    本篇文章将详细讲解四种经典的排序算法:快速排序、冒泡排序、选择排序和堆排序。 **快速排序**,由C.A.R. Hoare在1960年提出,是一种效率较高的分治算法。它的基本思想是选取一个“基准”元素,通过一趟排序将待...

    常用排序PK 冒泡 快排 选择排序 基数排序 等

    本文将详细解析几种常见的排序算法:冒泡排序、快速排序、选择排序以及基数排序,并探讨它们的工作原理、效率和适用场景。 **冒泡排序**: 冒泡排序是一种简单直观的排序算法,通过比较相邻元素并交换位置来实现...

    冒泡排序 BubbleSort

    5. **应用场景**:尽管冒泡排序的时间复杂度较高,不适合大规模数据的排序,但在教学和理解排序算法的基本原理时,冒泡排序仍然是一个很好的起点。此外,由于其简单易懂的特性,冒泡排序有时也用于小型数据集或对...

    JAVA快速,选择,冒泡数组排序

    本主题将详细介绍三种基本的排序算法:快速排序、选择排序和冒泡排序,以及它们在Java中的实现。 1. **快速排序**: 快速排序是一种高效的分治算法,由C.A.R. Hoare在1960年提出。其主要思想是通过一趟排序将待排...

    广州大学 数据结构实验报告 实验四 查找和排序算法实现

    4. **双向冒泡排序**:双向冒泡排序是在普通冒泡排序的基础上改进,从两端同时进行比较和交换,既能减少不必要的比较,也能提高排序效率。它分为两个方向,先从左向右,再从右向左,直到确定整个序列已经排序。 5. ...

    快速排序、选择排序、冒泡排序、希尔排序等6种排序算法C实现

    这里我们关注的是六种经典的排序算法:快速排序、选择排序、冒泡排序、希尔排序、插入排序以及懒人排序。这六种算法都是使用C语言实现的,因此对C编程有一定的基础要求。 1. **快速排序**:由英国计算机科学家C.A.R...

    直接插入排序 、冒泡排序、简单选择排序

    直接插入排序、冒泡排序和简单选择排序是三种常用的排序算法,它们分别应用于不同的场景中。在本实验报告中,我们将详细介绍这三种排序算法的实现过程。 一、直接插入排序 直接插入排序是一种简单的排序算法,它的...

    多种排序(快排,堆排序,组合排序,冒泡等)MFC

    组合排序是一种改进的插入排序,它结合了冒泡排序和希尔排序的思想。通过设置一个缩放因子,逐渐减少相邻元素之间的差距,加快元素的交换过程。在MFC中,组合排序可以使用自定义函数实现,根据数组大小动态调整缩放...

Global site tag (gtag.js) - Google Analytics