1.插入排序
插入排序是比较简单粗暴的排序算法之一,它的思路大致如下:
- 把待排序数组分成两部分,长度为1和长度为n-1的子数组,(长度为1的子数组此时已经是排序好的)
- 从第二个数组中按序拿出一个元素,并插入到第一个子数组的合适位置,使得第一个子数组依然是排好序的
- 重复步骤2,直至排序完成。
它的代码相对也比较简单,如下:
/** * 插入排序 * @param nums: 待排序数组 * @param len: 数组的长度 */ template<class Type> void insert_sort(Type nums[], int len) { for (int j = 1; j < len; j++) { Type key = nums[j]; int i = j - 1; //为该元素找到一个合适的位置,并插入 while (i >= 0 && nums[i] > key) { nums[i + 1] = nums[i]; i = i - 1; } nums[i + 1] = key; } }
接下来举个简单的例子:
假设待排序数组为{8, 2, 4, 9, 3, 6} 初始分成了{8} {2, 4, 9, 3, 6} 第一次 => {2, 8} {4, 9, 3, 6} 第二次 => {2, 4, 8} {9, 3, 6} 第三次 => {2, 4, 8, 9} {3, 6} 第四次 => {2, 3, 4, 8, 9} {6} 第五次 => {2, 3, 4, 6, 8, 9} 排序完成
代码过程如上例所示,插入排序的最坏时间复杂度为O(

插入排序的效率在规模小的时候和其他排序差别不大,当排序量较大的情况下,不建议使用。
想测效率的话可以在leetcode排序数组测试,不过应该会超时。。。
其他算法:
2.总结
在leetcode上的统一测试下:
快速排序的随机版本应该是最快的,大概88ms左右;其次是自然合并排序,大概96ms左右;其他的几个则相差了几个毫秒不等。
来源:https://blog.csdn.net/bull521/article/details/98884312