冒泡:适合链表,稳定
插排:适合于逆序对少的基本有序的数组,稳定
它们都是交换相邻点,每一次交换消除一个逆序对,所以交换的次数是一样的
要想让算法快起来,要一次交换消除多个逆序对
希尔排序:保持了插排的简单,同时试图克服一次只能消除一个逆序对,Dk间隔地进行插排,每次减少Dk的大小直到为1,这样的一个好处是到最后的1时数组基本有序
Dk的选取会影响算法复杂度,可以从array.length一直除2,也可以用其它的方法计算
选择排序:一次可以消除多个逆序对,交换的次数最坏是O(N),但是每次都要找到最小的值,都要遍历,所以无所谓最好情况与最坏情况都是O(N^2)
那优化就要从找最小数入手,那不就是用堆嘛
堆排:用最大堆,最小堆需要额外的数组保存
是选择排序的优化版
归并排序:适合于外排序,不适合于放到内存的内排序
递归法分而治之,最开始声明辅助数组,然后当做指针传人,每次重复利用
非递归也是开个数组,两个数组之间相互向对方归并
快排:分而治之,子集划分完后,pivot被一次性被放倒指定位置不再变化
表排序:不交换元素数组中的值,新建一个table,记录index,操作table里面的index,适合于只要求输出排序结果的情况
基数排序:每次按照一位一位排,拉成链表
桶排是基排的特殊情况(基数为1)
插排:适合于逆序对少的基本有序的数组,稳定
它们都是交换相邻点,每一次交换消除一个逆序对,所以交换的次数是一样的
要想让算法快起来,要一次交换消除多个逆序对
希尔排序:保持了插排的简单,同时试图克服一次只能消除一个逆序对,Dk间隔地进行插排,每次减少Dk的大小直到为1,这样的一个好处是到最后的1时数组基本有序
Dk的选取会影响算法复杂度,可以从array.length一直除2,也可以用其它的方法计算
选择排序:一次可以消除多个逆序对,交换的次数最坏是O(N),但是每次都要找到最小的值,都要遍历,所以无所谓最好情况与最坏情况都是O(N^2)
那优化就要从找最小数入手,那不就是用堆嘛
堆排:用最大堆,最小堆需要额外的数组保存
是选择排序的优化版
归并排序:适合于外排序,不适合于放到内存的内排序
递归法分而治之,最开始声明辅助数组,然后当做指针传人,每次重复利用
非递归也是开个数组,两个数组之间相互向对方归并
快排:分而治之,子集划分完后,pivot被一次性被放倒指定位置不再变化
表排序:不交换元素数组中的值,新建一个table,记录index,操作table里面的index,适合于只要求输出排序结果的情况
基数排序:每次按照一位一位排,拉成链表
桶排是基排的特殊情况(基数为1)