排序算法(Java随笔)—插入排序&shell排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40780805/article/details/82910619

插入排序(Insertion Sort):通过对数据执行逐个插入至合适的位置而完成排序工作;

  1. 首先对数组的前两个数据进行从小到大的排序。
  2. 将第三个数据与排好的两个数据比较,将第三个数据插入到合适的位置。
  3. 将第四个数据插入到已经排列好的前三个数据中。
  4. 重复以上过程,直到排序完成。

插入排序算法实例——代码实现:

//插入排序算法
	int[] insertSort(int[] data){
		//外循环,提取下一位数据与内循环中的数据比较
		for(int i=1;i<data.length;i++){
			int j=i;
			int temp=data[j];
			//内循环
			for(j-=1;j>=0&&temp<data[j];j-=1){
				data[j+1]=data[j];//若未找到,则将比temp更大的数据往后移一位
			}
			data[j+1]=temp;//当找到比temp数据更小的数据j时,将temp数据保存到j+1位置
		}
		return data;
	}

运行测试:

// 插入排序算法测试
	public static void main(String[] args) {
		int[] data = new int[] {9,4,6,8,7,1};
		SuanFa sf = new SuanFa();
		data = sf.insertSort(data);
		System.out.println(Arrays.toString(data));
	}

//运行结果:
[1, 4, 6, 7, 8, 9]

插入排序在对n个数据进行排序的时候,无论原数据有无顺序,都需要进行n-1步的中间排序,在数据已有一定顺序的情况下,排序效率较好;但如果数据无规则,则需要移动大量的数据,其排序效率也不是很好;

shell排序:也叫希尔排序或缩小增量排序。基于插入排序的思想。

  1. 将有n个元素的数组分为n/2个数字序列,第一个数据和第n/2+1个数据为一对

  2. 一次循环使每一个序列对排好顺序。
  3. 然后,再次将数组分为n/4个数字序列,再次排序。
  4. 重复分组,直到数字序列n/(2*x)=1,完成排序。

shell排序算法实例——代码实现:

//shell排序算法
	int[] shellSort(int[] data){
		//分组排序
		for(int i=data.length/2;i>=1;i/=2){
			//进行插入排序
			for(int j=i;j<data.length;j++){
				int k=j;
				int temp=data[k];
				for(k-=i;k>=0&&temp<data[k];k-=i){
					data[k+i]=data[k];
				}
				data[k+i]=temp;
			}
		}
		return data;
	}

运行测试:

// shell排序算法测试
	public static void main(String[] args) {
		int[] data = new int[] {9,4,6,8,7,1};
		SuanFa sf = new SuanFa();
		data = sf.shellSort(data);
		System.out.println(Arrays.toString(data));
	}

//运行结果:
[1, 4, 6, 7, 8, 9]

猜你喜欢

转载自blog.csdn.net/qq_40780805/article/details/82910619