插入排序算法中的直接插入法和希尔排序

原创 2015年11月18日 02:14:57

插入排序中有两种算法,一种是直接插入法,一种是希尔排序,希尔排序则是借助直接插入排序的原理进行排序,相较之直接插入排序在时间复杂度和空间复杂度上较低

1直接插入排序的原理:
在一组要排序的数中,假设前面n-1都是有序的,将第n个数与前面n-1个数进行比较,如果前面的数大于第n个数,就将第n-1位置上的数向后移动一位,再将第n个数继续与前面的数进行比较,如果前面的数小于第n个数的值,就将第n个数插入到空的位置上来

package www.wwg.cn;

/**
 * 直接插入排序
 * @author Administrator
 *
 */
public class InsertSort1 {

	public static void main(String args[]){
		int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5};
		
		for(int i=1;i<a.length;i++){           //设第一个进行比较的位置为1
			int temp=a[i];                 //将i=1的值赋给一个变量
			int j=i-1;                     //j为要排序参数前面的参数
			for(;temp<a[j]&&j>0;j--){      //当第i位的数小于前面i-1位的数且前面的位置不为0.就进行循环比较
				a[j+1]=a[j];           //把第i-1位置的数赋给i位置上去
			}
			a[j+1]=a[j];                    
		}
	}
}

2希尔排序

原理:将相距为d(n/2)的元素为一组进行比较,比较的方式采用直接插入排序,排序完毕将d变为相距为d/2的数为一组进行排序,以此类推,当d=1时就是两组有序数列进行比较,当对d=2时,进入满足条件的while语句时d=1,就是进行d=1的比较

/**
 * 希尔排序
 * @author Administrator
 *
 */
public class ShellSort {

	public static void main(String[] args){
		int[] a={2,3,6,23,65,2,7,3,9,34};
		int d=a.length;           //先算出数组的长度
		while(d>1){               //进入循环语句中,临界条件是d要大于1
			d=d/2;                 
			for(int x=0;x<d;x++){    //总共有多少组数列进行比较
                               //与直接插入排序原理相同				
				for(int i=x+d;i<a.length;i+=d){     
					int temp=a[i];
					int j=i-d;
					for(;j>=0&&temp<a[j];j-=d){
						a[j+d]=a[j];
					}
					a[j+d]=temp;
				}
			}
			
		}
		for(int i=0;i<a.length;i++){
			System.out.println(a[i]);
		}
	}
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

排序算法之直接插入排序和希尔排序

相信许多人和我一样,排序算法看了好几遍,当时看懂了,过几天一些细节又忘记,所以现在讲排序算法做一个总结,从最基本的排序算法展开来,首先分析直接插入排序和希尔排序。 1.直接插入排序 思想:把一个数...
  • lierjin312158950
  • lierjin312158950
  • 2016年04月09日 15:55
  • 661

C++排序之直接插入排序法

直接插入排序算法是将一个记录插入到已排序好的有序表中,从而得到一个新的,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。 要点...
  • lycx1234
  • lycx1234
  • 2017年02月07日 09:09
  • 1175

【Java常用排序算法】插入排序(直接插入排序、希尔排序)

插入排序 直接插入排序 希尔排序
  • donggua3694857
  • donggua3694857
  • 2017年02月25日 23:42
  • 568

数据结构之排序算法(五)-直接插入排序,希尔排序,直接选择排序

直接插入排序:时间复杂度:O(n^2) 基本算法思路是:把后面待排序的记录按其关键字的大小逐个插入到一个已经排好序的有序序列中,直到所有记录插完为止,得到一个新的有序序列。(无序插入前面有序) 算法步...
  • tuke_tuke
  • tuke_tuke
  • 2016年04月06日 11:24
  • 1103

排序算法(选择、希尔、二分插入、冒泡、直接插入、快速排序)

选择排序法                                                                                    第1趟,在待排序...
  • especialjie
  • especialjie
  • 2016年09月22日 11:21
  • 1233

排序算法一:直接插入排序

在我的博文《“主宰世界”的10种算法短评》中给出的首个算法就是高效的排序算法。本文将对排序算法做一个全面的梳理,从最简单的“冒泡”到高效的堆排序等。...
  • LG1259156776
  • LG1259156776
  • 2015年09月23日 22:08
  • 41948

【C】排序算法之——插入排序(直接插入排序)

#include void Insert(int *a,int *b)//插入排序,插入排序前面是最小的 { int j; for(int i=0;a[i]!='\0';i++) { if...
  • qq_31828515
  • qq_31828515
  • 2016年06月04日 20:08
  • 850

使用C#详解常用排序算法(二):插入排序(Insert Sort)

结合代码和运行输出详细讲解插入排序的排序过程
  • qqiang00
  • qqiang00
  • 2015年08月09日 09:48
  • 648

【排序算法】插入排序(C++实现)

插入排序的基本思想是每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。常见的插入排序有插入排序(Insertion Sort),希尔排序(She...
  • left_la
  • left_la
  • 2013年03月10日 20:22
  • 25726

插入排序/希尔排序/快速排序C语言实现

#include #include #include void swap(int *a,int *b) { int tmp=*a; *a=*b; *b=tmp; } void insertS...
  • ZYH920521
  • ZYH920521
  • 2015年06月16日 16:28
  • 467
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:插入排序算法中的直接插入法和希尔排序
举报原因:
原因补充:

(最多只允许输入30个字)