`

程序员必知8大排序3大查找(二)(转)

阅读更多

接上篇《程序员必知8大排序3大查找(一)》

 

本文我们先把剩余的三大排序说完,然后讨论一下排序的稳定性问题,最后再总结一下排序的时间复杂度和空间复杂度。

15见上篇)

6、快速排序

 

1)基本思想:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

2)实例:


 


上图中将待排序列分成两部分,一部分比基准元素小,一部分大于基准元素,然后对这两部分重复上图的求解过程。

(这只是快速排序的一种实现方式,个人认为比较容易理解)

 


7、归并排序


1)基本排序:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

2)实例:



 

8、基数排序


1)基本思想:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。

2)实例:



 

稳定性说明:排序前2(或者更多)个相等的数在序列的前后位置顺序和排序后它们在序列中的前后位置顺序一样。

 


实例:

待排序数列:5,4,8,6,1,8,7,9

排序结果:1,4,5,6,7,8,8,9

稳定:1,4,5,6,7,8,8,9

不稳定:1,4,5,6,7,8,8,9


说明:对比红色的8和紫色的8,看他们排序前后的位置。排序前,红8在紫8前面,如果排序后红8仍然在紫8前面,则排序算法稳定,否则不稳定。 


现在我们分析一下8排序算法的稳定性。

 

请网友结合前面的排序基本思想来理解排序的稳定性(8种排序的基本思想已经在前面说过,这里不再赘述)不然可能有些模糊)

 

1)直接插入排序一般插入排序,比较是从有序序列的最后一个元素开始,如果比它大则直接插入在其后面,否则一直往前比。如果找到一个和插入元素相等的,那么插入到这个相等元素的后面。插入排序是稳定的。

 

2希尔排序希尔排序是按照不同步长对元素进行插入排序,一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,稳定性就会被破坏,所以希尔排序不稳定。

 

3)简单选择排序在一趟选择,如果当前元素比一个元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。光说可能有点模糊,来看个小实例:858410第一遍扫描,1个元素8会和4交换,那么原序列中2个8的相对前后顺序和原序列不一致了,所以选择排序稳定。

 

4堆排序堆排序的过程是从第n/2开始和其子节点共3个值选择最大(大顶堆)或者最小(小顶堆),3个元素之间的选择当然不会破坏稳定性。但当为n/2-1, n/2-2, ...这些父节点选择元素时,有可能第n/2个父节点交换把后面一个元素交换过去了,而第n/2-1个父节点把后面一个相同的元素没有交换,所以堆排序并不稳定。

 

5冒泡排序:由前面的内容可知,冒泡排序是相邻的两个元素比较,交换也发生在这两个元素之间,如果两个元素相等,不用交换。所以冒泡排序稳定。

 

6快速排序在中枢元素和序列中一个元素交换的时候,很有可能把前面的元素的稳定性打乱。还是看一个小实例:6 4 4 5 4 7 8  9,第一趟排序,中枢元素6第三个4交换就会把元素4原序列破坏,所以快速排序不稳定。

 

7)归并排序:在分解的子列中,有1个或2个元素时,1个元素不会交换,2个元素如果大小相等也不会交换。在序列合并的过程中,如果两个当前元素相等时,我们把处在前面的序列的元素保存在结果序列的前面,所以,归并排序也是稳定的。

 

8基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序,最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集,所以是稳定的。

 

8种排序的分类,稳定性,时间复杂度和空间复杂度总结:




分享到:
评论

相关推荐

    程序员必知的8大排序3大查找

    ### 程序员必知的八大排序三大查找 #### 排序算法概览 排序算法是计算机科学中的一项基础技能,对数据进行排序能够帮助我们更高效地处理信息。以下将详细介绍八种常见的排序算法及其特点。 #### 1. 直接插入排序 ...

    程序员必知的8大排序(值得一看)

    ### 知识点一:直接插入排序 #### 基本思想 ...以上四种排序算法是程序员必须掌握的基本排序方法,每种算法都有其适用场景和优缺点。理解这些排序算法的工作原理对于优化程序性能、提高编程技能都至关重要。

    开发人员必知8大排序3大查找

    标题和描述中提到的知识点是IT领域中程序员必须掌握的基础算法——八大排序算法和三大查找算法。这些算法是数据处理和程序优化的核心,对于提升软件性能至关重要。下面将详细介绍这八大排序算法及其特点: 1. **...

    Java常用排序算法&程序员必须掌握的8大排序算法+二分法查找

    本资料包聚焦于"Java常用排序算法"和"程序员必须掌握的8大排序算法",并深入探讨了"二分法查找"这一高效搜索技术。 首先,我们来看八大排序算法。这些算法包括: 1. **冒泡排序**:最简单的排序方法,通过不断交换...

    程序员必备的八大排序三大查找

    每天都在叫嚣自己会什么技术,什么框架,可否意识到你每天都在被这些新名词、新技术所迷惑,.NET、XML等等技术固然诱人,可是如果自己的基础不...废话不多说,本文要介绍的这些排序算法就是基础中的基础,程序员必知!

    程序员必知excel操作

    下面将详细介绍一些程序员必知的Excel操作,帮助提升工作效率。 1. 数据整理: - **排序与筛选**:对数据进行升序或降序排列,利用条件筛选找出特定数据。 - **合并单元格**:在报表头部创建合并的标题,注意合并...

    程序员必知的十大基础实用算法及其讲解

    3. **递归排序:**递归地对基准左侧和右侧的子序列进行同样的操作,直到每个子序列的大小为零或一,此时序列被认为是已排序的。 **应用场景:** - 快速排序广泛应用于各种数据处理场景,特别是在大数据集的排序中...

    程序员必知必会经典算法

    "程序员必知必会经典算法"这个主题涵盖了编程领域中的重要概念,包括基础算法和数据结构,这些都是C、C++等语言中不可或缺的部分。下面将详细讨论这些经典算法及其在实际编程中的应用。 首先,我们要理解什么是算法...

    程序员必知的硬核知识大全.zip

    排序算法(如冒泡、快速、归并)和查找算法(如二分查找、哈希查找)是基础,而动态规划、贪心算法、回溯法等高级算法则需要更深层次的理解。数据结构如数组、链表、栈、队列、树(二叉树、红黑树)、图等,是解决...

    Java常用排序算法&程序员必须掌握的8大排序算法+二分法查找(同步到博客).doc

    【Java 常用排序算法】排序是编程中常见的任务之一,主要分为四类:插入排序、交换排序、选择排序和归并排序。此外,还有分配排序中的基数排序。以下是对这些排序算法的详细说明: 1. **直接插入排序**: 直接插入...

    java程序员必知的十种程序算法.doc

    冒泡排序是一种简单的排序算法,通过不断交换相邻的不正确顺序的元素,逐渐将较大的元素“冒”到数组的后端,时间复杂度为O(n^2)。 6. **选择排序**: 选择排序每次找到当前未排序部分的最小(或最大)元素,放到...

    数据结构查找、排序、二分查找、折半查找算法

    文件名中的"Sun数据结构第8章查找(第22-25讲).ppt"和"Sun数据结构第9章排序(第25-27讲).ppt"表明,内容可能详细涵盖了查找算法的各个方面,包括二分查找的原理、实现和优化,以及排序算法的介绍、实现步骤和性能...

    《计算机程序设计艺术(第3卷)》 第3卷:排序与查找 (第二版) 高清中文版 PDF

    这本书的第3卷专门探讨了排序与查找这两个核心的算法主题,它们是编程和数据处理的基础。在本卷中,Knuth深入剖析了各种排序和查找算法的设计、分析及其在实际应用中的性能表现。 排序算法是计算机科学中的重要组成...

    计算机程序设计艺术+第3卷:排序与查找(第二版)高清中文版

    此外,书中还会涉及到排序和查找算法的实现细节,如如何在内存有限的环境中优化,如何处理大规模数据,以及如何利用数据结构的特性提高算法效率。Knuth强调了算法设计的严谨性和可读性,提倡编写清晰、优雅的代码,...

    2013年软考程序员必考知识点总结

    【软考程序员必考知识点详解】 软考程序员是信息技术领域一项重要的资格认证考试,主要考察考生的基础编程能力、计算机系统知识、软件工程实践等方面。以下是对2013年软考程序员考试复习重点的详细解释: 1. **...

    c程序 排序 查找

    本压缩包文件包含的“c程序 排序 查找”聚焦于C语言中两个核心概念:排序和查找,这些都是数据处理和分析的基础。下面将详细阐述这两个知识点及其在实际中的应用。 首先,我们来探讨“排序”。排序是指将一组数据...

    C语言排序查找源代码

    这里,我们围绕“C语言排序查找源代码”这个主题进行深入探讨。 首先,让我们逐一分析这些文件名所代表的算法: 1. **快速排序.c**:快速排序是一种基于分治思想的高效排序算法,由C.A.R. Hoare在1960年提出。它的...

    算法 快速排序 冒泡排序 监视哨 折半查找

    快速排序、冒泡排序、监视哨以及折半查找是计算机科学中非常重要的基础算法,对于理解和应用编程至关重要,特别是对于参与ACM(国际大学生程序设计竞赛)或其他算法竞赛的程序员来说,这些都是必须掌握的核心技能。...

    计算机程序设计技巧3.排序查找

    在计算机科学领域,排序和查找是两个至关重要的概念,它们是程序设计的基础,广泛应用于各种软件和算法中。本文将深入探讨这两个主题,为程序员提供实用的技巧和策略。 **排序**是将一组数据按照特定的顺序进行排列...

    排序和查找

    排序和查找是计算机科学中最基础且重要的概念,尤其对于程序员来说,掌握这些算法对于优化程序性能至关重要。以下是对标题和描述中提及的八大排序算法和三大查找算法的详细解释: 1. **直接插入排序**: - 基本...

Global site tag (gtag.js) - Google Analytics