Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >算法——B/排序

算法——B/排序

作者头像
用户11015888
发布于 2024-03-11 11:58:32
发布于 2024-03-11 11:58:32
730
举报
文章被收录于专栏:csdncsdn

一、冒泡排序

A.冒泡思想

冒泡排序的思想是每次将最大的一下一下运到最右边,然后将最右边这个确定下来,再来确定第一大的,再确定第三大……

对于数组a[ ],具体的来说,每次确定操作就是从左往右扫描,如果a[i]>a[i +1],我们就执行swap(a[i],a[i+1])将两项交换,然后再往右检查,这样可以找出最大的并将其丢到最右边。

第一次确定操作是将a[1]~a[n]中最大的放到a[n];第二次确定操作是将a[1]~a[n-1]中最大的放到a[n-1]。依此类推(类似地,如果你想先把最小的放到左边也是可以的)时间复杂度为O(n^2)。由于排序过程中,数字像冒泡泡一样从左往右换过去,故名冒泡排序。

B.冒泡实现

冒泡排序一般用双重循环来实现。在这里 i 表示每次操作的右边界,也是存放当前操作最大值的位置。虽然 j 的范围是到 i-1,实际上 j+1 会到 i,所以可以使得操作是正确的。

二、选择排序

A.选择思想

选择排序的思想和冒泡排序类似,是每次找出最大的然后直接放到右边对应位置,然后将最右边这个确定下来(而不是一个一个地交换过去)再来确定第二大的、第三大的……对于数组a[ ],具体来说,每次确定操作(假设当前要确定的是i位置)就是从左往右扫描计算出最大元素的下标max_id,最后执行一次swap(a[max_id],a[])将两项交换即可。

第一次确定操作是将a[1]~a[n]中最大的放到a[n];

第二次确定操作是将a[1]~a[n-1]中最大的放到a[n-1]。

依此类推(类似地,如果你想先把最小的放到左边也是可以的),时间复杂度为O(n^2)。

B.选择排序实现

选择排序一般用双重循环来实现。 max_id表示最大元素的下标。 这里要注意的细节是j的范围是[1,i], 而在冒泡排序中j的范围是[1,i-1]

三、插入排序

A.插入思想

插入排序是一种简单直观的排序算法,其基本思想是将待排序的元素逐个插入到已排序序列的合适位置中,使得已排序序列逐渐扩大,从而逐步构建有序序列,最终得到完全有序的序列。 它类似于我们打扑克牌时的排序方式,将一张张牌插入到已经有序的手牌中时间复杂度为O(n^2)。

B.插入排序的实现

插入排序一般用双重循环来实现:初始时我们认为长度为1的数组a[1]是有序的(显然)然后将a[2]插入到合适的位置,使得a[1~2]有序,然后将a[3]插入,使得a[1~3]有序….直至a[1~ n]有序。

四、快速排序

A.快排思想

快速排序是一种基于分治法的排序方法,原理是将一个数组分成两个子数组,其中一个子数组的所有元素都小于另一个子数组的元素然后递归地对这两个子数组进行排序。 快速排序的思想是通过不断地将数组分成两个子数组,递归地对子数组进行排序,最终得到一个有序的数组。这个过程通过选择合适的基准和分区操作来实现。 快速排序拥有更好的时间复杂度Q(n log n),且不需要额外空间。

五、归并排序

A.归排思想

归并排序和快速排序类似,也是一种基于分治法的排序方法。 原理是将一个数组分成两个子数组,将子数组向下递归的排序后(当数组中仅有一个元素时无需再排序,直接返回)得到两个有序数组,然后进行O(n)的合并,最终合并成有序的原数组。 快速排序拥有较好的时间复杂度O(nlogn),但需要额外的空间用于合并数组O(n)。

六、桶排序

桶排序(Bucket sort)是一种非比较的排序算法。桶排序采用了一些分类和分治的思想,把元素的值域分成若干段,每一段对应一个桶。在排序的时候,首先把每一个元素放到其对应的桶中,再对每一个桶中的元素分别排序,再按顺序把每个桶中的元素依次取出,合并成最终答案。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
万字长文|十大基本排序,一次搞定!
大家好,我是老三,一个刷不动算法的程序员。排序算法相关题目尽管在力扣中不是很多,但是面试中动不动要手撕一下。接下来,我们看一下十大基本排序,
三分恶
2021/09/08
5390
45. 盘点那些必问的数据结构算法题之基础排序算法
排序算法也是面试中常常提及的内容,问的最多的应该是快速排序、堆排序。这些排序算法很基础,但是如果平时不怎么写代码的话,面试的时候总会出现各种bug。
用户11332765
2024/11/01
930
45. 盘点那些必问的数据结构算法题之基础排序算法
十大经典排序算法的介绍及实现
两两比较,如果后面的数比前面的数小,就交换位置。每轮迭代,本轮最大的数就好像气泡一样一直滚动到数组的最末端,因而得名冒泡排序。优点是不占用额外空间,原地排序,并且是稳定的,代码简单容易理解。致命缺点是时间复杂度达到了 O(n^2) 。冒泡排序可以在算法中添加一个变量记录每轮迭代中是否发生位置交换,如果某一轮发现没有任何位置交换,说明数组已经是有序的,可以直接退出,无需再进行后续迭代了。
兜兜转转
2023/03/29
4250
十大经典排序算法的介绍及实现
十大排序算法最详细讲解
冒泡排序无疑是最为出名的排序算法之一,从序列的一端开始往另一端冒泡(你可以从左往右冒泡,也可以从右往左冒泡,看心情),依次比较相邻的两个数的大小(到底是比大还是比小也看你心情)。
说故事的五公子
2020/07/10
5650
十大排序算法最详细讲解
面向程序员编程——精研排序算法
这篇文章很长,我花了好久的时间(中间公司出了bug,加班了好几天( ¯ ¨̯ ¯̥̥ ))进行整理,如有任何疑问,欢迎随时留言。 关键字:排序算法,时间复杂度,空间复杂度 排序就是研究如何将一系列数据按照某种逻辑顺序重新排列的一门算法。在计算机早期,排序要占用大量计算资源是人们的共识,而今天随着机器性能的提高,以及排序算法的演进,排序已经非常高效,现在随处都会提起数据的重要性,而整理数据的第一步就是排序。 引用自知乎:很多东西的难度,是随着需求变化的。比如排序吧,10个数字,我可以给你人
文彬
2018/05/09
1.7K0
面向程序员编程——精研排序算法
10大常用的排序算法(算法分析+动图演示)
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
Fivecc
2022/11/21
4160
10大常用的排序算法(算法分析+动图演示)
这或许是东半球分析十大排序算法最好的一篇文章
本文全长 14237 字,配有 70 张图片和动画,和你一起一步步看懂排序算法的运行过程。
五分钟学算法
2019/06/18
5740
这或许是东半球分析十大排序算法最好的一篇文章
七大经典、常用排序算法的原理、Java 实现以及算法分析
大家好,我是多选参数的程序锅,一个正在 neng 操作系统、学数据结构和算法以及 Java 的硬核菜鸡。数据结构和算法是我准备新开的坑,主要是因为自己在这块确实很弱,需要大补(残废了一般)。这个坑以排序为开端,介绍了 7 种最经典、最常用的排序算法,分别是:冒泡排序、插入排序、选择排序、归并排序、快速排序、桶排序、计数排序、基数排序。对应的时间复杂度如下所示:
syy
2020/06/23
7340
【愚公系列】软考中级-软件设计师 022-数据结构(排序算法)
直接插入排序是一种简单直观的排序算法,它的思想是将一个序列分为有序和无序两部分,每次从无序部分中取出一个元素,插入到有序部分的正确位置上,直到整个序列有序为止。
愚公搬代码
2024/02/03
2320
十种排序方法
在C语言中,有多种排序算法可供选择,每种都有其独特的特点和应用场景。以下是几种常见的排序算法及其在C语言中的总结:
ljw695
2024/10/18
1180
写代码?程序猿?你不能不懂的八大排序算法的Python实现
信息获取后通常需要进行处理,处理后的信息其目的是便于人们的应用。信息处理方法有多种,通常由数据的排序,查找,插入,删除等操作。本章介绍几种简单的数据排序算法和高效的排序算法.
风骨散人Chiam
2020/10/28
3510
杨校老师课堂之基于C++的排序算法详解_信息学奥赛-配套专项练习题汇总
排序算法是将一组数据按照特定顺序(如升序或降序)重新排列的算法,其核心目标是通过比较或非比较操作,使数据满足有序性要求。根据实现方式和特性,排序算法可分为以下类别:
杨校
2025/03/05
1200
杨校老师课堂之基于C++的排序算法详解_信息学奥赛-配套专项练习题汇总
十大经典排序算法:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、计数排序、基数排序、桶排序
排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
用户11375356
2024/11/22
2.1K0
十大经典排序算法:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、计数排序、基数排序、桶排序
Java基础算法详解
  查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中。因为其实现代码较短,应用较常见。所以在面试中经常会问到排序算法及其相关的问题。但万变不离其宗,只要熟悉了思想,灵活运用也不是难事。一般在面试中最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码。对这两种排序的代码一定要信手拈来才行。还有插入排序、冒泡排序、堆排序、基数排序、桶排序等。面试官对于这些排序可能会要求比较各自的优劣、各种算法的思想及其使用场景。还有要会分析算法的时间和空间复杂度。通常查找和排序算法的考察是面试的开始,如果这些问题回答不好,估计面试官都没有继续面试下去的兴趣都没了。所以想开个好头就要把常见的排序算法思想及其特点要熟练掌握,有必要时要熟练写出代码。
全栈程序员站长
2022/09/08
2640
算法笔记之排序
最近在看《算法笔记》,如果单从算法来说,这本书真正做到了短小精悍,首先以排序入题,那么我们今天也来说说排序。 排序 将一堆杂乱无章的元素按照某种规则有序排列的过程就叫“排序”.排序是一种非常基础的算法,有着广泛的理论和实践基础。对一个排序算法来说,一般从如下3个方面衡量算法的优劣: 时间复杂度:主要是分析关键字的比较次数和记录的移动次数。 空间复杂度:分析排序算法中需要多少辅助内存 稳定性:若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种算法是稳定的;反之,就是不稳定的。 排序算法
xiangzhihong
2018/02/05
9270
算法笔记之排序
【愚公系列】2023年11月 十一大排序算法(二)-快速排序
排序算法是一种将一组数据按照特定的规则进行排列的方法。排序算法通常用于对数据的处理,使得数据能够更容易地被查找、比较和分析。
愚公搬代码
2023/11/21
1800
十种常见排序算法
十种常见排序算法一般分为以下几种: (1)非线性时间比较类排序:交换类排序(快速排序和冒泡排序)、插入类排序(简单插入排序和希尔排序)、选择类排序(简单选择排序和堆排序)、归并排序(二路归并排序和多路归并排序);
恋喵大鲤鱼
2018/08/03
1.1K0
十种常见排序算法
八大排序算法图文介绍
八大排序算法图文介绍 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 常见的内部排序算
Java帮帮
2018/03/15
1.3K0
八大排序算法图文介绍
用 Python 手写十大经典排序算法
来源:https://github.com/hustcc/JS-Sorting-Algorithm
统计学家
2020/02/12
3700
用 Python 手写十大经典排序算法
八大排序算法总结与java实现
概述 因为健忘,加上对各种排序算法理解不深刻,过段时间面对排序就蒙了。所以决定对我们常见的这几种排序算法进行统一总结。首先罗列一下常见的十大排序算法: 请点击此处输入图片描述 我们讨论的这八大排序算法的实现可以参考我的Github:SortAlgorithms,其中也包括了排序测试模块[Test.java]和排序算法对比模块[Bench.java],大家可以试运行。 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排序算法,他们之间关系如下: 请点击此处输入图片描述 一、直接插入排序(In
企鹅号小编
2018/01/18
1.1K0
八大排序算法总结与java实现
推荐阅读
相关推荐
万字长文|十大基本排序,一次搞定!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档