算法(2) 插入排序算法 java

简介:插入排序和选择排序一样都是时间复杂度为O(N^2)的排序算法,相较于选择排序,插入排序可以提前终止内层循环,因此在性能上如果使用得当,要比选择排序性能好,尤其是面对近乎有序的源数据时,性能更是碾压选择排序甚至会比一些O(NlgN)的算法还要好.

原理:将一个数组划分为两部分,第一部分是已经排好序的,第二部分为未排序的,从未排序部分的第一个数据开始,逐一与前面已排好序的数据进行比较,如果比那个数据小就与之交换,直到该数据比当前数据大为止.按照以上原理将所有数据进行排序.

 步骤
  ①从未排好序的数据中取出第一个数据,作为待排序数据A
  ②用A与前面已排好序的数据B进行对比用来确定A应该放到哪个位置,如果A比B还小就应该交换A与B,否则停止内层循环,该位置就是A应处于的位置
  ③重复①②步骤直到没有未排序的数据为止

public class InsertionSort {
	public static void main(String[] args) {
		int[] arr = SortUtils.createArray(10000);
		int[] arr2 = SortUtils.copy(arr);
		sort(arr);
		betterSort(arr2);
	}
	
	public static void sort(int[] arr) {
		long starttime = System.currentTimeMillis();
		for (int i = 1; i <= arr.length - 1; i++) {
			for (int j = i; j > 0 && arr[j - 1] > arr[j]; j--) {
				arr[j - 1] = arr[j - 1] + arr[j];
				arr[j] = arr[j - 1] - arr[j];
				arr[j - 1] = arr[j - 1] - arr[j];
			}
		}
		System.out.println("sort time = " + (System.currentTimeMillis() - starttime) + " 毫秒");
	}
	/**
	 * 改进后的插入排序,在具有较少的元素类型值,或者比较有序的源数据进行排序时,可以有比较好的效果
	 * @param arr
	 */
	public static void betterSort(int[] arr) {
		long starttime = System.currentTimeMillis();
		for (int i = 1; i <= arr.length - 1; i++) {
			int t = arr[i];
			int j = i;
			for (; j > 0 && arr[j - 1] > t; j--) {
				arr[j] = arr[j - 1];  
			}
			if (j != i) {
				arr[j] = t;
			}
		}
		System.out.println("betterSort time = " + (System.currentTimeMillis() - starttime) + " 毫秒");
	}

}
以下是运行截图


结论:优化之后的插入排序比未优化的插入排序 性能会好一些, 比选择排序更是全方位的胜出

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值