一、插入排序(从小到大为例)
算法思想:(直接)插入排序在我看来就是一小段一小段的从前到后分段的排序。从第二个元素开始,设置下标为i,将每轮循环的第i个元素当作Key与其前面的元素做对比。找到下标j对应的arr[j]的值比Key小而arr[j+1]的值比Key大的位置,将其插入,然后继续下一次的循环直到结束。
时间复杂度:O(n²)
二、折半插入排序(从小到大为例)
算法思想:折半插入排序是插入排序基于二分法的优化。直接插入排序在每次与第i个元素前面的元素做对比的时候是顺序对比的,而在i前面的元素是排序完成后的,故只需通过二分法找到第i个元素值应该插入的位置即可。
时间复杂度:O(n²)
三、希尔排序(从小到大)
算法思想:希尔排序在我看来是采用类似极限思想的对插入排序的优化。此算法设置一个间隔,间隔一般取数组长度的1/2向下取整。根据此间隔将本来的数组分组,然后在组内使用插入排序,同时减半间隔大小直到间隔为1,达到基本有序后最后一次插入排序,完成排序。
四、冒泡排序(从小到大)
算法思想:若传入的数组元素个数为n,则默认需要进行n-1趟排序。每趟排序过程中对元素两两进行比对,符合条件进行交换,将最大或最小的值向冒泡一样排序到数组一端。可设置一个类型的变量flag来判断数组是否进行了交换,若无发生交换则代表有序。
时间复杂度:O(n²)
五、快速排序(从小到大)
算法思想:快排的思想就是通过设定一个基准值(一般为数组第一个值)来通过low和high两个指针来对比数组中的值确定基准值base的最终排序位置(low为低位,high为高位)。在此期间先向左移动high指针直到找到一个比基准值base小的元素,将此元素放到当前low的位置;随后开始向右移动low指针直到找到比base大的元素,再将此元素放到当前high的位置。按此规律一直进行下去直到low和high指向同一位置,即为base应该在的最终排序位置。这样就将其划分为了另外两个子表,再递归的将划分出的两个子表快排,直到low>high,即整个序列有序。
时间复杂度:最好情况:O() 最坏情况:O(n²)
快速排序是所有内部排序算法中平均性能最优的排序算法。
六、简单选择排序(从小到大)
算法思想:依次从数组元素中找出最小(或最大)的元素放在首位。最后只剩一个元素时不需要再对比排序 。
空间复杂度:O(1) 时间复杂度:O(n²) 稳定性:不稳定
七、堆排序
算法思想:堆排序就是将序列建立成大根堆(或小根堆)的形式,然后将堆顶(也就是数组最大值,建立成大根堆后的数组的第一个元素)与数组的最后一个元素呼互换,以此来将数组最大值放到数组的最后边。然后数组的长度减一,对前面的n-1个元素继续上面的操作,直到数组排序完成。
注:大顶堆即为父节点大于左右孩子的完全二叉树,将大根堆形成的完全二叉树层序遍历即为大根堆的数组。