数据结构复习之插入排序

插入排序的基本思想:逐个考察待排序队列中的每个元素,将元素插入到前面已经排好序队列的适当位置,使得到的新队列任然有序。

插入排序方法:直接插入排序、折半插入排序、shell排序。

1.直接插入排序

排序原理:对一个元素的序列总是有序的,对N序列来说,从第二个元素开始到第N个元素,逐个向有序队列中添加元素(插入操作).从而使N序列有序。对j-1个元素的有序序列插入一个元素的方法:(假设升序排列)从j-1开始往前找,如果当前元素比要插入的元素大(temp<arr[k]),则将当前元素后移,直到找到插入位置(temp>arr[k]).在插入元素。

public static void insertSort(int[] arr){
	int len = arr.length;
	//i=0 只有一个元素,认为是有序队列,所以从i=1开始.
	for(int i=1;i<len;i++){
              //小于时需要将r[i] 插入到有序队列中
		if(arr[i]<arr[i-1]){		
		 	int temp = arr[i];//取出当前值
		   	arr[i] = arr[i-1];//队列后移 
			int j = i-2; //temp 要和有序队列中的前i-1个(0到i-2)元素比较.(arr[i-1]已经比较过了)
			//比较并后移.
			for(;j>=0&&arr[j]>temp;j--){
		    	  arr[j+1] = arr[j];
			}
		 	arr[j+1] = temp;//插入正确位置.
		}
	}
}

 

 

2.折半插入排序

  排序原理:通过折半查找的方式在有序序列中确定元素要插入的位置,其他和直接插入一样。

 

 

public static void biinsertSort(int[] arr){
	int len = arr.length;
	for(int i=0;i<len;i++){	
		//二分查找的方式查找元素要插入的位置
		int low = 0;
		int hight = i-1;
		int temp  = arr[i]; //取出要插入元素的值,否则元素后移覆盖.
		while(low<=hight){
			int mid = (low+hight)/2;
			if(arr[i]<arr[mid]){
				hight = mid-1;
			}else{
				low = mid+1;
			}
		}
			
		//在hight到i-1位置的元素往后移动.
		for(int j = i-1;j>hight;j--){
			arr[j+1] = arr[j];
		}
		arr[hight+1] = temp;//插入元素
	}}

 

 

 3.shell排序

    有空研究一下

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(数据结构,J#)