稳定性指两个相同的对象经过排序后相对位置是否变化。
复杂度指算法中基本操作重复执行的次数是问题规模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)
稳定性:稳定
原理:
1、设数组内存放了n个待排数字,数组下标从1开始,到n结束。
2、初始化i=1
3、从数组的第i个元素开始到第n个元素,寻找最小的元素。
4、将上一步找到的最小元素和第i位元素交换。
5、i++,直到i=n-1算法结束,否则回到第3步
时间复杂度:O(n^2)
空间复杂度:O(1)
稳定性:不稳定
四、快速排序(quicksort)
原理:
时间复杂度:O(nlog n)
空间复杂度:0(logn),要为递归程序执行过程栈所需的辅助空间
稳定性:不稳定
五、希尔排序:(shell sort)
原理:
1、先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。
2、所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;
3、然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量
时间复杂度:O(n^1.3)
空间复杂度:0(1)
稳定性:不稳定
六、堆排序(heapsort)
n个关键字序列Kl,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质):
时间复杂度: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)
稳定性:稳定