常见的算法整理
2022-04-05 22:13:05 0 举报
AI智能生成
算法整理:选择排序,冒泡排序,归并排序,插入排序,希尔排序,快速排序,堆排序,计数排序,桶排序,基数排序
作者其他创作
大纲/内容
选择排序
时间复杂度
平均
O(n^2)
最好
O(n^2)
最坏
O(n^2)
空间复杂度
O(1)
稳定性
不稳定
定义
选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。
冒泡排序
时间复杂度
平均
O(n^2)
最好
O(n)
O(n^2)
最坏
空间复杂度
O(1)
稳定性
稳定
定义
比较相邻的元素。如果第一个比第二个大,就交换他们两个。 [1]
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 [1]
针对所有的元素重复以上的步骤,除了最后一个。 [1]
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 [1]
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 [1]
针对所有的元素重复以上的步骤,除了最后一个。 [1]
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 [1]
归并排序
时间复杂度
平均
O(n*logn)
最好
O(n*logn)
最坏
O(n*logn)
空间复杂度
O(n)
稳定性
稳定
定义
归并操作,也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法。
如 设有数列{6,202,100,301,38,8,1}
初始状态:6,202,100,301,38,8,1
第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3;
第二次归并后:{6,100,202,301},{1,8,38},比较次数:4;
第三次归并后:{1,6,8,38,100,202,301},比较次数:4;
总的比较次数为:3+4+4=11;
逆序数为14;
如 设有数列{6,202,100,301,38,8,1}
初始状态:6,202,100,301,38,8,1
第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3;
第二次归并后:{6,100,202,301},{1,8,38},比较次数:4;
第三次归并后:{1,6,8,38,100,202,301},比较次数:4;
总的比较次数为:3+4+4=11;
逆序数为14;
插入排序
时间复杂度
平均
O(n^2)
最好
O(n)
最坏
O(n^2)
空间复杂度
O(1)
稳定性
稳定
定义
直接插入排序是将无序序列中的数据插入到有序的序列中,在遍历无序序列时,首先拿无序序列中的首元素去与有序序列中的每一个元素比较并插入到合适的位置,一直到无序序列中的所有元素插完为止。对于一个无序序列arr{4,6,8,5,9}来说,我们首先先确定首元素4是有序的,然后在无序序列中向右遍历,6大于4则它插入到4的后面,再继续遍历到8,8大于6则插入到6的后面,这样继续直到得到有序序列{4,5,6,8,9}。
希尔排序
时间复杂度
平均
O(n^1.3)
最好
O(n^2)
最坏
O(n^2)
空间复杂度
O(1)
稳定性
不稳定
定义
希尔排序需要定义一个增量,这里选择增量为gap=length/2,缩小增量以gap=gap/2的方式,这个增量可以用一个序列来表示,{n/2,(n/2)/2....1},称为增量序列,这个增量是比较常用的,也是希尔建议的增量,称为希尔增量,但其实这个增量序列不是最优的。
快速排序
时间复杂度
平均
O(n^logn)
最好
O(n^logn)
最坏
O(n^2)
空间复杂度
O(n^logn)
稳定性
不稳定
定义
快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
堆排序
时间复杂度
平均
O(n^logn)
最好
O(n^logn)
最坏
O(n^logn)
空间复杂度
O(1)
稳定性
不稳定
定义
将初始待排序关键字序列(R1,R2....Rn)构建成大顶堆,此堆为初始的无序区
将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,......Rn-1)和新的有序区(Rn)
由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,......Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2....Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成
将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,......Rn-1)和新的有序区(Rn)
由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,......Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2....Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成
计数排序
时间复杂度
平均
O(n^k)
最好
O(n^k)
最坏
O(n^k)
空间复杂度
O(n^k)
稳定性
稳定
定义
一、找到数组中最大值和最小值
二、建立一个max-min+1的数组空间,每个元素初始值为0
三、遍历要排序的无序数组
比如说,第一个数是2,那么数组下标为2的元素加1
第二个数是3,那么数组下标为3的元素加1
以此类推
四、到最后,我们就得到了一个数组,数组中每一个值,代表了下标值在排序数组内出现的次数。
五、直接遍历我们得到的数组,输出下标值,元素的值为多少,就输出几次。
二、建立一个max-min+1的数组空间,每个元素初始值为0
三、遍历要排序的无序数组
比如说,第一个数是2,那么数组下标为2的元素加1
第二个数是3,那么数组下标为3的元素加1
以此类推
四、到最后,我们就得到了一个数组,数组中每一个值,代表了下标值在排序数组内出现的次数。
五、直接遍历我们得到的数组,输出下标值,元素的值为多少,就输出几次。
桶排序
时间复杂度
平均
O(n^k)
最好
O(n)
最坏
O(n^2)
空间复杂度
O(n+k)
稳定性
稳定
定义
根据待排序集合中最大元素和最小元素的差值范围和映射规则,确定申请的桶个数;
遍历待排序集合,将每一个元素移动到对应的桶中;
对每一个桶中元素进行排序,并移动到已排序集合中。
遍历待排序集合,将每一个元素移动到对应的桶中;
对每一个桶中元素进行排序,并移动到已排序集合中。
基数排序
时间复杂度
平均
O(n^k)
最好
O(n^k)
最坏
O(n^k)
空间复杂度
O(n^k)
稳定性
稳定
定义
基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。
0 条评论
下一页