排序算法总结(2)--插入排序
2017-05-18 20:42
162 查看
一、简介
插入排序对于少量元素的排序以及部分有序数组的排序,是一个有效的算法。插入排序的工作原理和整理一手扑克牌的过程一样。开始时,左手为空,每次从桌子上拿一张扑克牌并插入左手正确的位置。为了找到这张牌的正确位置,我们从右到左将它与手中的扑克牌比较,直到找到一张比它小的牌,将它插入这张牌的后面。此时手中所有的牌已经有序。在计算机实现中,为了要给插入的牌腾出位置,需要将一部分元素在插入之前右移。二、伪代码
算法:插入排序的非递归算法 输入:未排序的数组 A 输出:已排序的数组 A InsertionSort(A) for j=1 to A.length-1 key=A[j]; // 将array[j]插入到已排序的数组[1,...,j-1]中 i=j-1; while i>=0 and A[i]>key A[i+1]=A[i]; i=i-1; A[i+1]=key;
三、代码实现
public class Method { public static void main(String[] args) { int[] array={31,41,59,26,41,58}; insertionSort(array); } public void insertionSort(int[] array){ for (int j=1;j<array.length;j++){ int key=array[j]; // 将第j个元素插入前面排序好的序列里 int i=j-1; while (i>=0 && array[i]>key) { array[i+1]=array[i]; i--; array[i+1]=key; } } } }
四、复杂度分析
时间复杂度:最好情况:O(n)
最坏情况:O(n^2)
平均情况:O(n^2)
空间复杂度:O(1),原址排序
五、注意事项
对于随机排列的长度为n且元素不重复的数组来说,最坏情况下需要大约n(n−1)/2次比较和大约n(n−1)/2次移动,最好情况下需要n−1次比较和0次移动。插入排序对于部分有序的数组效果很好。以下是几种典型的部分有序数组:
(1). 数组中每个元素距离他最终的位置不远
(2). 一个有序的大数组接一个小数组
(3). 数组中只有几个元素的位置不正确
插入排序在一次循环之后不能确定任何一个元素的最终位置,直到所有元素排序好之才能确定元素的最终位置。
相关文章推荐
- 数据结构与算法:七种排序算法总结(冒泡排序、选择排序、直接插入排序、希尔排序、堆排序、归并排序、快速排序)
- 排序算法总结(一)插入排序【Insertion Sort】
- 排序算法总结之直接插入排序
- 排序算法总结---直接插入排序
- 【排序算法总结】直接插入排序
- 排序算法总结3-插入排序
- 排序算法总结(冒泡排序、直接插入排序、希尔排序)(python实现)
- 排序算法总结(一)---- 直接插入排序,希尔排序(java实现)
- 排序算法总结---直接插入排序
- 排序算法总结(三)插入排序
- 排序算法总结(一)——冒泡、插入、希尔与选择排序
- C语言实现基本排序算法----排序(直接插入排序,SHELL排序,冒泡排序,快速排序,简单选择排序,堆排序)
- 排序算法汇总(选择排序 ,直接插入排序,冒泡排序,希尔排序,快速排序...)
- 二叉排序树总结(插入,搜索,排序,中序遍地,递归,非递归)
- 二叉排序树总结(插入,搜索,排序,中序遍地,递归,非递归)
- 【转】排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
- Java数组排序总结(冒泡,选择,插入,希尔)
- (转) Java 数组排序总结 ( 冒泡,选择,插入,希尔)
- 排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序
- 两种排序算法 插入排序 和冒泡排序:插入排序要比冒泡快2倍以上