码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-03-16 16:29:20      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

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);
	}

}


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

标签:

原文地址:http://blog.csdn.net/woliuyunyicai/article/details/44306779

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!