插入排序

插入排序

主要用途

  插入排序适用于少量元素的排序。时间复杂度  空间复杂度

过程分析

  这里我们主要通过图解的方式详述插入排序的过程:见下图:

这里选择 序列 {3,1,2,4,6,5 }作为初始序列,图中阴影部分表示下次要插入的序列中的元素。

  1、原始序列中选择第一个元素作为初始序列,此例中3为初始序列,1为要插入的元素

  2、首先比较1与3的大小,可以从图2 中看出由于1小于3,所以3向后移动1位,1插入当前位置即可。

  3、从图2到图3的过程中,2首先跟3比较大小,由于2小于3,所以3向后移动1位,然后比较2与1的大小,2大于1所以 不必再向前比较大小(因为1在它左边的队列中已经是最 大的元素)。2插入到当前的位置即可。

  4、依次类推知道整个队列排序完。

插入排序代码

  C语言代码

#include"stdio.h"

insert_sort(int *array,int length){
	int i,j,key = 0;
	
	for(i = 1; i < length; i++){

		key = array[i];
		
		j = i-1;
		while( j>=0 && array[j] > key){
			
			if(array[j] > key){
				array[j+1] = array[j];
			}
			j--;
		}
		array[j+1] = key;
	}
}
int main(){
	
	int array[] = {3,1,2,4,6,5},length = 0,i;
	
	length = sizeof(array)/sizeof(array[0]);
	
	insert_sort(array,length);
	
	for(i = 0;i<length;i++){
		printf("%d ",array[i]);
	}
	return 0;
}

  Java代码

public class insertSort {

	public static void insert_sort(Integer... array){
		
		for(int i = 1,j,key; i < array.length; i++){
			
			key = array[i];
			
			j = i-1;
			
			while(j>=0 && array[j] > key){
				
				if(array[j] > key){
					array[j+1] = array[j];
				}
				j--;
			}
			
			array[j+1] = key;
		}
		for(int i = 0;i<array.length;i++){
			
			System.out.print(array[i]+" ");
		}
	}
	
	public static void main(String[] args){
		
		Integer[] array={3,1,2,4,6,5};
		
		insert_sort(array);
		
	}
}

算法分析

  时间复杂度分析

    这里根据算法导论中提供的思路:舍每条语句执行的时间代价为c,次数为n。

    只考虑核心部分代码的时间复杂度:                                                                             代价                            次数

for(i = 1; i < length; i++){                                              c1               n

		key = array[i];                                           c2               n-1
		
		j = i-1;                                                  c3               n-1
		while( j>=0 && array[j] > key){                           c4               sum(t(i))(2~n)
			
			if(array[j] > key){                               c5               sum(t(i)-1)(2~n)
				array[j+1] = array[j];                    c6               sum(t(i)-1)(2~n)
			}
			j--;                                              c7               sum(t(i)-1)(2~n)
		}
		array[j+1] = key;                                         c8               n-1
	}

    T(n) = c1*n+c2*(n-1)+c3*(n-1)+c4*(sum(t(i))(2~n))+c5*(sum(t(i)-1)(2~n))+c6*(sum(t(i)-1)(2~n))+c7*(sum(t(i)-1)(2~n))+c8*(n-1);

    经过整理:

         最佳情况 :a*n -b

         最坏情况:a*n^2+b*n+c

  空间复杂度分析

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值