排序算法之插入排序(Java)

1.直接插入排序

《算法导论》P10,《数据结构》P265

向已经排好序的数组a[1..j-1]插入a[j],进行一趟循环遍历。插入排序的基本操作是在一个有序表进行查找和插入。每一趟插入排序从后往前进行比较,便于数组中元素的向后移动。

空间复杂度:O(1)(当使用swap交换时,可实现原址)

时间复杂度:(n^2)/4
即O(n^2)

2.拓展

1)折半查找排序

插入排序的基本操作是在一个有序表进行查找和插入。由查询故可以想到“二分查找”即折半查找,通过折半查找找到插入位置,再操作数组插入

代码:

//插入排序
public class Insert_Sort {

	//直接插入排序
	public void InsertSort(int[] data)
	{
		if((data != null)&&(data.length > 0))
		{
			for(int i = 1;i < data.length; i ++)
			{
				int key = data[i];//记录下当前需要插入的数字,作为哨兵
				int index = i - 1;//记录哨兵最终要插入的位置
				//一直循环找到第一个比key小的位置
				while((index > 0)&&(data[index] > key))
				{
					//后移数组
					data[index + 1] = data[index];
					index --;
				}
				//将哨兵插入
				data[index + 1] = key;
			}
		}
	}

	//直接插入排序实现方法二
	public void InsertSort2(int[] data)
	{
		if((data != null)&&(data.length > 0))
		{
			for(int i = 1;i < data.length; i ++)
			{
				int key = data[i];//记录下当前需要插入的数字,作为哨兵
				int index = i - 1;//记录哨兵最终要插入的位置
				//一直循环找到第一个比key小的位置
				while((index > 0)&&(data[index] > key))
				{
					//直接交换数据,即将要插入的值通过不断往前交换,插入到合适的值
					swap(data, index + 1, index);
					index --;
				}
			}
		}
	}

	//折半插入排序
	public void BinaryInsertSort(int[] data)
	{
		if((data != null)&&(data.length > 0))
		{
			for(int i = 1;i < data.length; i ++)
			{
				int key = data[i];//记录下当前需要插入的数字,作为哨兵
				int start = 0;
				int end = i - 1;
				//二分查找
				while(start < end)
				{
					int mid = (start + end) / 2;
					if(data[mid] > key)//插入点在前半段
					{
						end = mid - 1;
					}
					else if(data[mid] < key)//插入点在后半段
					{
						start = mid + 1;
					}
					else          //相等即找到插入点
					{
						start = end = mid;
					}
				}

				//移动数组插入,注意要从后往前移动,且此时start=mid
				for(int j = i - 1; j > end; j--)
				{
					data[j + 1] = data[j];
				}
				data[end + 1] = key;
			}
		}
	}

	private void swap(int[] data , int a, int b)
	{
		int temp = data[a];
		data[a] = data[b];
		data[b] = temp;
	}

	public static void main(String[] args) {
		int data[] = {2,34,45,2,13,24,5,24,57};
		Insert_Sort insert_Sort = new Insert_Sort();
		insert_Sort.BinaryInsertSort(data);
		Main.print_array(data);
	}

}
时间: 2024-10-12 12:40:46

排序算法之插入排序(Java)的相关文章

排序算法之插入排序Java实现

排序算法之直接插入排序 一.直接插入排序的过程 1.直接插入排序由 N-1 趟排序组成.2.基本思想:将第一个元素看成一个有序子序列,再依次从第二个记录起诸葛插入到这个有序的子序列中. 一般地,将 elem[i] 插入到由 elem[0] ~ elem[i-1] 构成的有序子序列中 时间复杂度:O(n) ~ O(n^2) 原始数组为:[74, 27, 85, 59, 41, 66, 37, 92, 4, 93]--------------------------------------第 1趟[

排序算法系列——插入排序

记录学习点滴,菜鸟成长记 接触算法是研究生期间做项目时,需要编写一些诸如GA.QGA的时候,第一次使用“排序”还是用的Java自带的Comparator接口.后来买了<算法导论>来看,发现果然所有知识都是有专业壁垒的,简单的一个问题尽然蕴藏着如此多的思想,发现此简直欣喜无比,遂决定要好好研究研究.只有深入后才发现,原来算法的不仅仅是按照逻辑顺序写个程序那么简单,好的算法要考虑到方方面面,最简单的时间复杂度就够我学习很长时间了. 将自己学习排序算法的一些理解和感悟记录于此,方便自己温故而知新.

排序算法 之 插入排序

本次介绍排序算法中的插入排序. 1.直接插入排序: 基本思想: 直接插入排序也需要对待排序的序列在外层进行n-1次遍历,每次遍历时只把本次遍历次数处的元素和该元素之前的元素进行比较,来决定插入位置,并把从插入位置开始到该元素之前的所有元素后移,使从序列开始到该元素为止序列中的元素有序,直至遍历完成序列整体有序,插入排序算法的时间复杂度为O(n2): 如下表格所示为待排序的序列: 3 2 1 7 6 5 4 8 9 当进行第一次遍历时把元素e[1]和e[0]作比较,e[1]<e[0],所以e[1]

我的Java开发学习之旅------&gt;Java经典排序算法之插入排序

一.算法原理 插入排序法:所谓插入排序法乃是将一个数目插入该占据的位置. 假设我们输入的是 "53,27,36,15,69,  42" 我们从第二个数字开始,这个数字是27,我们的任务只要看看27有没有正确的位置,我们的做法是和这个数字左边的数字来比,因此我们比较27和53,27比53小,所以我们就交换27和53,原来的排列就变成了"27, 53, 36, 15, 69, 42 " 接下来,我们看第3个数字有没有在正确的位置.这个数字是36,它的左边数字是53,36

各种排序算法python和java实现(二)

第一篇博客实现了三种最基本最简单的排序算法,本篇文章将在这三种算法的基础上稍微演变一下. 1.快排 光从名字看就知道速度肯定不差,前一篇讲的冒泡排序,怎么看都不算是一种好的排序算法,里面充斥了太多的无谓的交换动作,时间复杂度倒是很稳定o(n^2),但对于排序算法实在说不过去.快排是冒泡排序的改进版,思路就是分治,将一个序列随机按照某个值分成两个子序列,子序列A里面的值全部比该值大,另一个子序列B的值全部比该值小,这听起来像是二叉排序树.然后依次对子序列进行如上操作,很明显快排最简单的实现就是用递

常用排序算法简介以及Java实现代码

排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列.分内部排序和外部排序.若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序.反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序. 稳定排序:假设在待排序的文件中,存在两个或两个以上的记录具有相同的关键字,在用某种排序法排序后,若这些相同关键字的元素的相对次序仍然不变,则这种排序方法是稳定的. 冒泡,插入,基数,归并属于稳定排序 选择,快速,希尔,堆

排序算法之冒泡排序Java实现

排序算法之冒泡排序 一.初级的冒泡排序 import java.util.Arrays; /** * * @title BubbleSort * @describe 冒泡排序 * @author 张富昌 * @date 2016年10月1日下午3:56:30 */public class BubbleSortLow { // 起泡排序是快速排序的基础,但是排序速度较慢. // 基本思想:将序列中第 1 个元素与第 2 个元素进行比较,如前者大于后者,则两个元素交换位置,否则不交换: // 再将第

排序算法之一插入排序

基本思想 每次将一个待排序的记录,按其关键字大小,插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止. 分类 根据寻找插入位置方法分为 直接插入排序 折半(二分)插入排序 希尔插入排序 直接插入排序 基本思想 当插入第i(i≥1)个对象时,前面的V[0],V[1],-,V[i?1]已经排好序.这时,用V[i]的排序码与V[i?1],V[i?2],-,V[0]的排序码顺序进行比较,找到插入位置即将V[i]插入,原来位置上的对象向后顺移. 直接插入排序图示 从上到下,分别展示了直接排

算法学习之排序算法:插入排序(直接插入排序、折半插入排序、2-路插入排序)

引言: 插入排序作为最简单易于理解的排序算法,基本实现比较简单.本文详细介绍直接插入排序,并给出实现,简单的介绍折半插入排序,并给出2-路插入排序和表插入排序两种插入排序,但并未给出具体实现. 一.直接插入排序 直接插入排序的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的.记录数增1的有序表. 算法描述: 步骤1.将待排序的一组记录中的第1个记录拿出来作为一组有序的记录(当然此时该组记录仅有1个记录). 步骤2.依次将待排序的一组记录中的记录拿出来插入到前面已排好序的记录中. 步

八大排序算法之一插入排序

基本思想: 将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表.即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止. 要点:设立哨兵,作为临时存储和判断数组边界之用. 如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面.所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的. 效率:时间复杂度:O(n2),空间复杂度为 O(1). 下面此题是HDU-1040题:(