标签:
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);
}
}
标签:
原文地址:http://blog.csdn.net/woliuyunyicai/article/details/44306779