草庐IT

数据结构:排序- 插入排序(插入排序and希尔排序) , 选择排序(选择排序and堆排序) , 交换排序(冒泡排序and快速排序) , 归并排序

目录前言复杂度总结预备代码插入排序1.直接插入排序:时间复杂度O(N^2)\空间复杂度O(1)复杂度(空间/时间):2.希尔排序:时间复杂度O(N^1.3~N^2)空间复杂度为O(1)复杂度(空间/时间):选择排序1.直接选择排序时间复杂度O(N^2)/空间复杂度O(1)复杂度(空间/时间):2.堆排序:时间复杂度O(N*logN)/空间复杂度O(1)复杂度(空间/时间):交换排序1.冒泡排序:时间复杂度O(N^2)/空间复杂度O(1)复杂度(空间/时间):2.快速排序2.1.hoare版本时间复杂度为O(n)/空间复杂度为O(1)​编辑2.2.挖坑法相比hoare本质上并没有简化复杂度​编辑

归并排序

一、算法描述归并排序,是创建在归并操作上的一种有效的排序算法。算法是采用分治法的一个非常典型的应用,且各层分治递归可以同时进行。归并排序思路简单,速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。思路如下:取分界点,intmid=(l+r)/2;递归排序左右两段,merge_sort(a,l,mid),merge_sort(a,mid+1,r);归并,合二为一(二路归并)归并排序取的分界点是区间中点,快排取的是数组中的数。归并排序时间复杂度也是O(nlogn)。归并排序的空间复杂度是O(n)的,因为要开一个额外的数组来存储排序的数。二、题目描述给定你一个长度为\

【C语言】归并排序

文章目录一、什么是归并排序二、归并排序步骤图解三、归并排序代码实现1、递归实现2、非递归实现四、总结一、什么是归并排序归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。二、归并排序步骤图解算法思想:归并排序算法有两个基本的操作,一个是分解,另一个是合并。分解是把原数组划分成两个子数组的过程,合并可以将两个有序数组合并成一个更大的有序数组。将待排序的线性表不断地切分成若干个子表,直到每个子表只包含一个元素,

【算法】排序——归并排序和计数排序

 =========================================================================主页点击直达:个人主页我的小仓库:代码仓库C语言偷着笑:C语言专栏数据结构挨打小记:初阶数据结构专栏Linux被操作记:Linux专栏LeetCode刷题掉发记:LeetCode刷题算法头疼记:算法专栏 =========================================================================目录前言归并排序 递归实现代码非递归实现归并排序计数排序排序算法复杂度及稳定性分析前言上两篇文章讲解了

【算法基础】一文掌握十大排序算法,冒泡排序、插入排序、选择排序、归并排序、计数排序、基数排序、希尔排序和堆排序

目录1冒泡排序(BubbleSort)2插入排序(InsertionSort)3选择排序(SelectionSort)4.快速排序(QuickSort)5.归并排序(MergeSort)6堆排序(HeapSort)7计数排序(CountingSort)8基数排序(RadixSort)9希尔排序(ShellSort)10桶排序  1冒泡排序(BubbleSort)       冒泡排序是一种基本的排序算法,其核心思想是多次遍历待排序的元素,比较相邻的两个元素,如果它们的顺序不正确,则交换它们,直到整个数组按照指定顺序排列。defbubble_sort(arr):n=len(arr)foriinr

【数据结构】手撕归并排序(含非递归)

目录一,归并排序(递归)1,基本思想 2,思路实现二,归并排序(非递归)1,思路实现2,归并排序的特性总结:一,归并排序(递归)1,基本思想归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(DivideandConquer)的一个非常典型的应用;将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序,若将两个有序表合并成一个有序表,称为二路归并;归并排序核心步骤: 2,思路实现这个归并排序乍一看像一颗二叉树,事实也是如此,如上图所示我们需要不断的拆分直至拆成一个元素此时就是有序的,然后再合并,合并的时候不要选择原地合并(原地

八大排序(三)堆排序,计数排序,归并排序

一、堆排序什么是堆排序:堆排序(Heap Sort)就是对直接选择排序的一种改进。此话怎讲呢?直接选择排序在待排序的n个数中进行n-1次比较选出最大或者最小的,但是在选出最大或者最小的数后,并没有对原来的序列进行改变,这使得下一次选数时还需要对全部数据进行比较,效率大大降低。堆排序的原理:将待排序序列构造成一个大顶堆此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。如果读到这里,对堆的一些概念不懂得可以翻阅我的另一篇博客“数据结构——【堆】_#欲速则不达#

【算法与数据结构】归并排序的代码实现(详细图解)以及master公式的讲解

目录1、归并排序 1.1、算法描述 1.2、图解说明2、代码实现 3、master公式3.1、公式以及结论3.2、适用于某些特殊的递归3.3、计算归并排序的时间复杂度1、归并排序归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用递归或者说是分治法(DivideandConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 1.1、算法描述把长度为n的输入序列分成两个长度为n/2的子序列;对这两个子序列分别采用归并排序;将两个排序好的子序列合并成一个最终的排序序列。而将两个的

【LeetCode力扣】LCR170 使用归并排序的思想解决逆序对问题(详细图解)

目录1、题目介绍2、解题思路2.1、暴力破解法2.2、归并排序思想2.2.1、画图详细讲解2.2.2、归并排序解决逆序对的代码实现1、题目介绍首先阅读题目可以得出要点,即当前数大于后数时则当作一个【逆序对】,而题目是要求在一个数组中计算一共存在多少个这样的逆序对并输出结果。  原题链接:LCR170.交易逆序对的总数-力扣(LeetCode)​2、解题思路2.1、暴力破解法看到这里的第一反应就是这不是很简单吗?心想着这困难题也不过如此吧(笑)。就是直接使用暴力破解法,只需要两个for循环嵌套,一个record[i]在原地,另一个record[j]将后面所有遍历一遍,只要比record[i]的小

【数据结构】排序算法(二)—>冒泡排序、快速排序、归并排序、计数排序

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》🌝每一个不曾起舞的日子,都是对生命的辜负目录前言1.冒泡排序2.快速排序2.1Hoare版2.2占坑版2.3前后指针版2.4三数取中对快速排序的优化2.5非递归版3.归并排序3.1递归版3.2非递归版3.3外排序问题 4.计数排序前言本篇文章博主将继续带来排序算法实现,主要讲解交换排序思想中的冒泡排序、三种快速排序递归版和一种非递归版,归并排序中的递归版和非递归版,以及计数排序的相关内容。欢迎大家📂收藏📂以便未来做题时可以快速找到思路,巧妙的方法可以事半功倍。==============