排序算法——插入排序


title: 算法基础——排序算法
abbrlink: 2213989909
date: 2019-11-17 21:06:25
categories:

  • Algorithms
    tags:
  • 排序算法

排序

插入排序

  • 插入排序由N-1趟排序组成

代码

/** * 插入排序 * * @param <E> * @param a */
	public static <E extends Comparable<? super E>> void insertSort(E[] a) {
		int j;
		for (int p = 1; p < a.length; p++) {
			E tmp = a[p];
 // compareTo(T o)
// 比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
			for (j = p; j > 0 && tmp.compareTo(a[j - 1]) < 0; j--) {
				a[j] = a[j - 1];

			}
			a[j] = tmp;
		}
	}

原理

对于p =1到 N-1趟,插入排序保证从位置 0 到位置 p上的元素为已排序状态。

对于p =1到 N-1趟,插入排序保证从位置 0 到位置 p上的元素为已排序状态。

策略我们将位置p上的元素左移,直到他在前面的p-1个元素中找到正确位置

在第13 -17行,实现了数据的移动而没有明显地使用交换。位置p上的元素存储在tmp,而所有更大的元素都向右移动一个位置,然后tmp放置在正确的位置上

分析

由于嵌套排序,所以每一个都花费N次迭代,因此插入排序为O(N2)

而输入数据已经预先排序,则时间为O(N),因为内层for循环检测判定不成立而终止。而实际上,平均情形为O(N2)

两个定理

  • N个互异数的数组的平均逆序数是N(N-1)/4
  • 通过交换相邻元素进行排序的任何算法的平均都需要Ω(N2)时间

希尔排序(缩减增量排序)

  • 通过比较相距一定间隔的元素工作
  • 各趟比较所用的距离随算法的进行而减少,直到只比较相邻元素的最后一趟排序为止。
public static <E extends Comparable<? super E>> void shellsort(E [] a) {
		int j;
		for(int gap = a.length/2;gap>0;gap/=2) {
			for(int i = gap;i<a.length;i++) {
				E tmp = a[i];
				for(j =i;j>=gap && tmp.compareTo(a[j-gap])<0;j-=gap) {
					a[j] = a[j-gap];
				}
				a[j] =tmp;
			}
		}
	}
全部评论

相关推荐

不愿透露姓名的神秘牛友
10-12 10:48
已编辑
秋招之苟:邻居家老哥19届双2硕大厂开发offer拿遍了,前几天向他请教秋招,他给我看他当年的简历,0实习实验室项目技术栈跟开发基本不沾边😂,我跟他说这个放在现在中厂简历都过不了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务