深海的算法探索_插入排序算法(简单插入排序/希尔排序)

常用的排序算法分为

  1. 交换排序 ( 冒泡排序 / 快速排序 )   https://blog.csdn.net/qq_39731011/article/details/95204290
  2. 插入排序 ( 简单插入排序 / 希尔排序 )    https://blog.csdn.net/qq_39731011/article/details/95342246
  3. 选择排序 ( 简单选择排序 / 堆排序 )   https://blog.csdn.net/qq_39731011/article/details/95457842
  4. 归并排序    https://blog.csdn.net/qq_39731011/article/details/95614787
  5. 基数排序 ( 桶排序 )    https://blog.csdn.net/qq_39731011/article/details/95995693

今天要说的是:插入排序

插入排序 顾名思义,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入

如下文中,您有别的见解,欢迎评论指正,深海谢过诸位灵长类

简单插入排序

依据深海的理解举一个简单的例子:

未排序序列是:[5,9,8,4,2]

已排序序列是:暂时没有.

第一次执行插入: 将5拿出来  放到已排序序列

执行后:

未排序序列是:[9,8,4,2]

已排序序列是:[5]

第二次执行插入: 将9拿出来, 从已排序序列从后向前扫描,发现对应的位置在5的后面

执行后:

未排序序列是:[8,4,2]

已排序序列是:[5,9]

第二次执行插入: 将8拿出来, 从已排序序列从后向前扫描,发现对应的位置在5和9的中间

执行后:

未排序序列是:[4,2]

已排序序列是:[5,8,9]

以此类推,最终排序完成

public int[] Test() {
	int[] array={5,9,8,4,2};
	int i,j,temp; //temp 正在执行插入的数
	for(i=1;i<array.length;i++) {
		temp=array[i];
		for(j=i-1;j>=0;j--) {
		   if (temp > array[j]) {  //顺序正确,停止探索
			   break;
		   }else{//元素后移
	    	   array[j+1] = array[j]; 
	       }
		}
		array[j+1]=temp;
	}
    return array;
}

希尔排序

希尔排序呢就是简单插入排序的升级版,

原理如下:

1.在逻辑的层面,将数组分成若干小数组,然后排序

2.之后将分组的条件更改,分组跨度变小,然后再排序

3.循环往复,直到跨度降到1时,排序整个数组.

该排序因为分组原因,相同大小的数可能顺序颠倒.所以该排序方式为不稳定排序

public static void shellSort(int[] arr) {
		for(int gap=arr.length/2; gap>0; gap/=2) { /*步长逐渐减小*/
			for(int i=gap; i<arr.length; i++) { /*在同一步长内*/
				//同一步长内排序方式是插入排序
				int temp = arr[i], j; //待排元素
				//j-gap代表有序数组中最大数的下标,j-pag表示有序数组的前一个元素,减pag是减去偏移量就是步长
				for(j=i; j>=gap && temp<arr[j-gap]; j-=gap)
					arr[j] = arr[j-gap]; //原有序数组最大的后移一位
				arr[j] = temp; //找到了合适的位置插入
			}
		}
	}
发布了54 篇原创文章 · 获赞 212 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_39731011/article/details/95342246