二分查找插入排序
2013-05-03 14:21
295 查看
1.概念:
先前有复习过插入排序,插入排序的时间复杂度是O(n2),,如果比较的代价远大于交换的代价,则可以使用二分查找插入排序,其时间复杂度也是O(n2),其比较次数比较少
2.实现步骤:
通过折半查找在数组的有序部分找到待插入值应插入的位置,再通过交换法将数据插入的位置。
3代码实现:
public class BinaryInsectionSort
{
/// <summary>
/// 待排序数组
/// </summary>
public int[] arr { get; set; }
/// <summary>
/// 插入排序
/// </summary>
public void InsectionSort()
{
if (arr == null)
{
Console.WriteLine("未将待排序对象引用设置到实例");
return;
}
for (int i = 1; i < arr.Length; i++)
{
int j = i;
while (j > 0 && arr[j] < arr[j - 1])
{
int temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
j--;
}
}
}
/// <summary>
/// 二分查找插入排序
/// </summary>
public void BinaryInsSort()
{
if (arr == null)
{
Console.WriteLine("未将待排序对象引用设置到实例");
return;
}
for(int i=1;i<arr.Length;i++)
{
int left = 0;
int right = i;
while (left < right)
{
int mid = (left + right) / 2;
if (arr[mid] > arr[i])
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
//此时left为要插入的位置
for (int m = i; m > left; m--)
{
int temp = arr[m];
arr[m] = arr[m - 1];
arr[m - 1] = temp;
}
}
}
}
4.测试代码
BinaryInsectionSort bis = new BinaryInsectionSort();
bis.arr = new int[] { 1,5,7,9,2,12,8,13,16,4};
bis.InsectionSort();
for (int i = 0; i < bis.arr.Length; i++)
{
Console.Write(bis.arr[i]+" ");
}
Console.Write("\n");
bis.arr = new int[] { 1, 5, 7, 9, 2, 12, 8, 13, 16, 4 };
bis.BinaryInsSort();
for (int i = 0; i < bis.arr.Length; i++)
{
Console.Write(bis.arr[i] + " ");
}
Console.Write("\n");
5.运行结果:
1 2 4 5 7 8 9 12 13 16
1 2 4 5 7 8 9 12 13 16
请按任意键继续. . .
先前有复习过插入排序,插入排序的时间复杂度是O(n2),,如果比较的代价远大于交换的代价,则可以使用二分查找插入排序,其时间复杂度也是O(n2),其比较次数比较少
2.实现步骤:
通过折半查找在数组的有序部分找到待插入值应插入的位置,再通过交换法将数据插入的位置。
3代码实现:
public class BinaryInsectionSort
{
/// <summary>
/// 待排序数组
/// </summary>
public int[] arr { get; set; }
/// <summary>
/// 插入排序
/// </summary>
public void InsectionSort()
{
if (arr == null)
{
Console.WriteLine("未将待排序对象引用设置到实例");
return;
}
for (int i = 1; i < arr.Length; i++)
{
int j = i;
while (j > 0 && arr[j] < arr[j - 1])
{
int temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
j--;
}
}
}
/// <summary>
/// 二分查找插入排序
/// </summary>
public void BinaryInsSort()
{
if (arr == null)
{
Console.WriteLine("未将待排序对象引用设置到实例");
return;
}
for(int i=1;i<arr.Length;i++)
{
int left = 0;
int right = i;
while (left < right)
{
int mid = (left + right) / 2;
if (arr[mid] > arr[i])
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
//此时left为要插入的位置
for (int m = i; m > left; m--)
{
int temp = arr[m];
arr[m] = arr[m - 1];
arr[m - 1] = temp;
}
}
}
}
4.测试代码
BinaryInsectionSort bis = new BinaryInsectionSort();
bis.arr = new int[] { 1,5,7,9,2,12,8,13,16,4};
bis.InsectionSort();
for (int i = 0; i < bis.arr.Length; i++)
{
Console.Write(bis.arr[i]+" ");
}
Console.Write("\n");
bis.arr = new int[] { 1, 5, 7, 9, 2, 12, 8, 13, 16, 4 };
bis.BinaryInsSort();
for (int i = 0; i < bis.arr.Length; i++)
{
Console.Write(bis.arr[i] + " ");
}
Console.Write("\n");
5.运行结果:
1 2 4 5 7 8 9 12 13 16
1 2 4 5 7 8 9 12 13 16
请按任意键继续. . .
相关文章推荐
- 冒泡 选择 插入排序 二分查找 代码备忘
- 二分查找插入排序
- 【算法】_009_插入排序_二分查找优化
- 冒泡 选择 插入排序 顺序 二分查找方法
- C 语言 排序算法,冒泡排序,选择排序,插入排序,二分查找
- 算法---冒泡排序,快速排序,二分查找(折半查找),选择排序,插入排序
- 二分查找插入排序
- [整理]插入排序以及二分查找排序
- C语言:编写查找和排序函数(二分查找,冒泡排序,选择排序法,插入排序)
- C#泛型版的超级优化的快速排序算法和插入排序、二分查找算法
- 二分插入排序和二分查找
- 第四篇、C_快速、冒泡、选择、插入排序、二分查找排序、归并、堆排序
- 排序算法之带二分查找的插入排序
- java的冒泡排序、选择排序与插入排序与二分查找
- 《算法导论》第二章----插入排序(伪代码实现、课后习题(递归版本、二分查找策略版本))
- 插入排序 二分查找
- 冒泡排序,插入排序,二分查找
- 冒泡排序,改进型冒泡排序,插入排序,二分查找
- 数据结构--加入二分查找的插入排序(优化)
- 优化的直接插入排序(二分查找插入排序,希尔排序)