排序算法

。_饼干妹妹 提交于 2019-11-26 14:15:52

1.插入排序

插入排序是比较简单粗暴的排序算法之一,它的思路大致如下:

  1. 把待排序数组分成两部分,长度为1和长度为n-1的子数组,(长度为1的子数组此时已经是排序好的)
  2. 从第二个数组中按序拿出一个元素,并插入到第一个子数组的合适位置,使得第一个子数组依然是排好序的
  3. 重复步骤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排序数组测试,不过应该会超时。。。

其他算法:

  1. 快速排序
  2. 合并排序

2.总结 

在leetcode上的统一测试下:

快速排序的随机版本应该是最快的,大概88ms左右;其次是自然合并排序,大概96ms左右;其他的几个则相差了几个毫秒不等。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!