java 中常见的排序——插入排序(直接插入排序,希尔排序)

java 中常见的排序——插入排序(直接插入排序,希尔排序)

插入排序的基本思想概述

  1. 直接插入排序:一个无序的序列或者一个数组,将第一个元素当做一个有序的数列,然后将后面无序数列的第一个元素与有序数列中的元素从后往前依次比较,找到合适的位置插入进去。这就好像打扑克牌,左手拿的牌总是一个有序的组合,右手抓牌,从后往前依次比较,插入合适的位置当中。
  2. 希尔排序: 将一个数组分为多个子序列,然后对每个序列进行直接插入排序。

插入排序图解

直接插入排序

在这里插入图片描述

希尔排序

在这里插入图片描述

代码提现

直接插入排序代码

public class InsertSortDemo {

	public static void main(String[] args) {

		int[] arr = { 5, 3, 1, 8, 4, 2 };
		System.out.println("排序前:");
		printArray(arr);
		System.out.println("插入排序后:");
		insertSort(arr);
		printArray(arr);
	}

	private static void insertSort(int[] arr) {
		// 控制循环的次数
		for (int i = 1; i < arr.length; i++) {
			/*
			 * 判断语句:
			 * 		j > 0 保证 j-1处索引是数组下标范围内
			 * 		arr[j] < arr[j-1] 无序序列的第一个元素与有序序列的元素,从后往前依次比较
			 * 		当这两个条件都满足时,交换数据。
			 */
			for (int j = i; (j > 0) && arr[j] < arr[j - 1]; j--) {
				swap(arr, j, j - 1);
			}
		}

	}

	/**
	 * 交换arr数组中下标x 和 y的元素位置
	 * 
	 * @param arr
	 * @param x
	 * @param y
	 */
	private static void swap(int[] arr, int x, int y) {
		int temp = arr[x];
		arr[x] = arr[y];
		arr[y] = temp;
	}

	/**
	 * 输出数组arr中的元素
	 * @param arr
	 */
	private static void printArray(int[] arr) {
		for (int i : arr) {
			System.out.print(i + " ");
		}
		System.out.println();
	}
}

输出结果:

排序前:
5 3 1 8 4 2
插入排序后:
1 2 3 4 5 8

希尔排序代码提现

public class ShellSortDemo {
	public static void main(String[] args) {
		int[] arr = { 9, 4, 5, 0, 1, 8, 7, 3, 6, 2 };
		System.out.println("排序前:");
		printArray(arr);
		shellSort(arr);
		System.out.println("希尔排序后:");
		printArray(arr);
	}

	private static void shellSort(int[] arr) {
	
		int num = 0;
		
		for (int i = arr.length/2; i >= 1; i /= 2) {
			num++;
			for (int j = 0; j < i; j++) {
				//以不同增量值开始分组,然后对不同分组进行直接插入排序
				insertSort(arr,j,i);
			}
			System.out.println("第"+num+"次希尔排序后:");
			printArray(arr);
		}
	}

	/**
	 * 以不同增量分组后进行直接插入排序
	 * 
	 * @param arr	 排序的数组
	 * @param start 初始位置
	 * @param grap	增量
	 */
	private static void insertSort(int[] arr, int start, int grap) {
		for(int x = start+grap;x < arr.length;x++){
			for(int y = x;(y>=grap)&&(arr[y]<arr[y-grap]);y-=grap){
				swap(arr, y, y-grap);
			}
		}
	}

	/**
	 * 交换arr数组中下标x 和 y的元素位置
	 * 
	 * @param arr
	 * @param x
	 * @param y
	 */
	private static void swap(int[] arr, int x, int y) {
		int temp = arr[x];
		arr[x] = arr[y];
		arr[y] = temp;
	}

	/**
	 * 输出数组arr中的元素
	 * 
	 * @param arr
	 */
	private static void printArray(int[] arr) {
		for (int i : arr) {
			System.out.print(i + " ");
		}
		System.out.println();
	}

}

输出结果:

排序前:
9 4 5 0 1 8 7 3 6 2
第1次希尔排序后:
8 4 3 0 1 9 7 5 6 2
第2次希尔排序后:
1 0 3 2 6 4 7 5 8 9
第3次希尔排序后:
0 1 2 3 4 5 6 7 8 9
希尔排序后:
0 1 2 3 4 5 6 7 8 9

注意

希尔排序是一种不稳定的排序方式,当一个序列中出现重复的数据时,可能会交换了两个相同数据的位置,并不是排序的输出会有什么问题。

写的不好还望见谅,如果有什么错误请指出,谢谢!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值