各种排序的时间复杂度,空间复杂度,稳定性

稳定性指两个相同的对象经过排序后相对位置是否变化。

复杂度指算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。

一、冒泡排序:(bubble sort)

原理:

1、从列表的第一个数字到倒数第二个数字,逐个检查:若某一位上的数字大于他的下一位,则将它与它的下一位交换。

2、重复1号步骤,直至再也不能交换。

时间复杂度:O(n^2)

空间复杂度:O(1),不需要额外空间

稳定性:稳定

二、插入排序:(insertion sort)

原理:

1、首先从1到n-1循环取出一个数,令temp = i(1<= i <= n-1),将其与前面数比较,如果比它大,则不用操作

2、如果比前面一个数小,则array[i] = array[i-1],一直比下去,如果到了比它小的数,就放在该数后面一个位置

3、重复1,2号步骤,直至原数列为空。

时间复杂度:O(n^2)

空间复杂度:O(1)

稳定性:稳定

三、选择排序(selection sort)

原理:

1、设数组内存放了n个待排数字,数组下标从1开始,到n结束。

2、初始化i=1

3、从数组的第i个元素开始到第n个元素,寻找最小的元素。

4、将上一步找到的最小元素和第i位元素交换。

5、i++,直到i=n-1算法结束,否则回到第3步

时间复杂度:O(n^2)

空间复杂度:O(1)

稳定性:不稳定

四、快速排序(quicksort)

原理:

1、设置两个变量i、j, 排序开始的时候:i=0,j=N-1;
2、以第一个数组元素作为关键数据,赋值给 key,即 key=A[0];
3、从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于 key的值A[j],将A[j]和A[i]互换;
4、从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于 key的A[i],将A[i]和A[j]互换;
5、重复第3、4步,直到i=j;

时间复杂度:O(nlog n)

空间复杂度:0(logn),要为递归程序执行过程栈所需的辅助空间 

稳定性:不稳定

五、希尔排序:(shell sort)

原理:

1、先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。

2、所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序

3、然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量

            Dn 
=1, ,即所有记录放在同一组中进行直接插入排序为止,一般初次取序列一半为增量,以后每次减半,直到增量为1。

时间复杂度:O(n^1.3)

空间复杂度:0(1)

稳定性:不稳定

六、堆排序(heapsort)

n个关键字序列Kl,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质):

(1)ki<=k(2i)且ki<=k(2i+1)(1≤i≤ n/2),当然,这是小根堆,大根堆则换成>=号。//k(i)相当于 二叉树的非 叶子结点,K(2i)则是左子节点, k(2i+1)是右子节点

时间复杂度:O(N*logN)

空间复杂度:堆排序是就地排序,辅助空间为O(1)

稳定性:不稳定

七、归并排序(merge sort)

时间复杂度:O(n log n

空间复杂度:O(n)

稳定性:稳定

八、桶排序(bucket sort)、基数排序(radix sort)

原理:

它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,可以合并再分桶,或者是在桶中直接排好序

时间复杂度:d个关键码,关键码的取值范围为radix,则进行链式基数排序的时间复杂度为O(d(n+radix))

空间复杂度:O(n)

稳定性:稳定


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值