图解插入排序--直接插入排序
来源:互联网 发布:学directx编程要多久 编辑:程序博客网 时间:2024/05/29 19:18
排序思路:每次将一个待排序的元素与已排序的元素进行逐一比较,直到找到合适的位置按大小插入。
第一趟比较示图:
算法实现:
public static void insertsort(int arr[]){ for(int i = 1;i < arr.length; i ++){ if(arr[i] < arr[i-1]){//注意[0,i-1]都是有序的。如果待插入元素比arr[i-1]还大则无需再与[i-1]前面的元素进行比较了,反之则进入if语句 int temp = arr[i]; int j; for(j = i-1; j >= 0 && arr[j] > temp; j --){ arr[j+1] = arr[j];//把比temp大或相等的元素全部往后移动一个位置 } arr[j+1] = temp;//把待排序的元素temp插入腾出位置的(j+1) } } } public static void main(String[] args) { int array[] = {4,2,1,5}; System.out.println("排序之前:"); for(int element : array){ System.out.print(element+" "); } insertsort(array); System.out.println("\n排序之后:"); for(int element : array){ System.out.print(element+" "); } }}
结果:
排序之前: 4 2 1 5 排序之后:1 2 4 5
算法分析:1.当元素的初始序列为正序时,仅外循环要进行n-1趟排序且每一趟只进行一次比较,没有进入if语句不存在元素之间的交换(移动)。此时比较次数(Cmin)和移动次数(Mmin)达到 最小值。
Cmin = n-1 Mmin = 0;
此时时间复杂度为O(n)。
2.当元素的初始序列为反序时,每趟排序中待插入的元素都要和[0,i-1]中的i个元素进行比较且要将这i个元素后移(arr[j+1] = arr[j]),i个元素后移移动次数当然也就为i 了,再加上temp = arr[i]与arr[j+1] = temp的两次移动,每趟移动的次数为i+2,此时比较次数(Cmin)和移动次数(Mmin)达到最小值。
Cmax = 1+2+…+(n-1) = n*(n-1)/2 = O(n2)
Mmax = (1+2)+(2+2)+…+(n-1+2) = (n-1)*(n+4)/2 = O(n2) (i取值范围1~n-1)
此时时间复杂度为O(n2)。
3.在直接插入排序中只使用了i,j,temp这3个辅助元素,与问题规模无关,所以空间复杂度为O(1).
4.在整个排序结束后,即使有相同元素它们的相对位置也没有发生变化,
如:5,3,2,3排序过程如下
A–3,5,2,3
B–2,3,5,3
C–2,3,3,5
排序结束后两个元素3的相对位置没有发生改变,所以直接插入排序是一种稳定排序。
- 图解直接插入排序
- 图解插入排序--直接插入排序
- 直接插入排序算法图解
- 插入排序--直接插入
- 插入排序------直接插入
- 插入排序---直接插入
- 插入排序--直接插入排序
- 插入排序-直接插入排序
- 【插入排序】直接插入排序
- 插入排序-直接插入排序
- 插入排序:直接插入排序
- 插入排序-直接插入排序
- 插入排序--直接插入排序
- 插入排序-直接插入排序
- 插入排序-直接插入排序
- 排序:直接插入排序
- 排序---直接插入排序
- 排序 -- 直接插入排序
- myeclipse2014如何添加源码反编译工具插件
- ZigBee 用IO口模拟I2C驱动程序
- nginx 中的 rewrite 和 try_files
- MyEclipse配置Tomcat7
- django入门笔记
- 图解插入排序--直接插入排序
- uva 275 Expanding Fractions
- 移动端如何让页面强制横屏
- struts2.3.23升级到struts2.3.32
- git基本操作
- linux下的管道
- MyEclipse10.6 myeclipse2013下添加jadClipse反编译插件 .用于显示源码
- 如何用npm来安装jsx插件和安装fis插件
- Spring的BeanFactoryPostProcessor和BeanPostProcessor