数据结构之直接插入排序与折半插入排序(java实现)

一、直接插入排序思想与过程

        定义:

        直接插入排序时一种最简单的排序方法,其基本操作是将一条记录插入到已排好序的有序表中,从而得到一个新的、记录数量增1的有序表

        算法步骤:

        1、待排序序列存放在数组r[1.....n]中

        2、循环n-1次,从r[2]开始,直至r[n]结束,每次使用顺序查找法,查找r[i]在r[1....i-1]有序表中的位置,然后将r[i]插入表长为i-1的有序序列r[1......i-1]。重复n-1次,最后得到一个表长为n的有序序列


二、直接插入排序算法实现

       public static void InsertSort1(int[] arr) {	//直接插入排序
		int j;
		
		for(int i=1;i<arr.length;i++) {
			int tmp=arr[i];
			
			if(tmp<arr[i-1]) {
				
				for(j=i-1;j>=0&&arr[j]>tmp;j--) {
					arr[j+1]=arr[j];
				}
				
				arr[j+1]=tmp;
			}
		}
	}


三、折半插入排序思想与过程

         1、基本思想:

                在前面所说的直接插入排序中采用顺序查找法查找当前记录在已排序好序的序列中插入位置,由以前的学习可得,这个查找可用折半查找来实现,由此进行的插入排序称之为折半插入排序


         2、算法步骤

                    同直接插入排序步骤

四、折半插入排序算法实现

    public static void InsertSort2(int[] arr) {	//折半插入排序
		int i;
		
		for(i=1;i<arr.length;i++) {			//采用折半查找算法寻找到一个数在其后面有序序列的位置
			
			if(arr[i]<arr[i-1]) {
				int low=0;
				int high=i-1;
				int mid;
				int tmp=arr[i];
				
				while(low<=high) {
					mid=(low+high)/2;
					
					if(arr[i]<arr[mid]) {
						high=mid-1;
					}
					else
						if(arr[i]>arr[mid])
							low=mid+1;
						else {
							high=mid;
							break;
						}
							
				}
				
				for(int j=i-1;j>=high+1;j--) {
					arr[j+1]=arr[j];
				}
				
				arr[high+1]=tmp;
			}
		}
	}


附:本文为作者原创,转载请注明出处

    限于本人的水平与能力,欢迎大家批评指正


猜你喜欢

转载自blog.csdn.net/qq_36441169/article/details/80760815