9种排序算法 2_二分插入排序

一  算法思想:

每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止;而查找适当位置的查找方法使用二分查找法,则叫做二分插入排序。

二  代码如下:

public class Test2 {
// 二分插入排序。随机数列中(100个),计算交换次数(交换的次数在2400-2800左右,时间复杂度O(n*n),效率与直接插入排序一样,只是改变查找方法)

public static void binaryInsertSort(int[] array) {
int temp;
int temp2;
int count = 0; // 计算交换元素的次数
// 外层循环控制数组元素,与之前的元素比较
for (int i = 1; i < array.length; i++) {
int sign = 0; // 设置信号 ,记录插入点
if (array[i] < array[i - 1]) {
if (array[i] < array[0]) {
sign = 0;
} else {
// 二分查找,得到要插入地方的sign值
int start = 1;
int end = i - 1;
int middle;
while (start <= end) {
middle = (start + end) / 2;
if (array[i] >= array[middle - 1]
&& array[i] <= array[middle]) {
sign = middle;
break;
} else if (array[i] > array[middle]) {
start = middle + 1;
} else {
end = middle - 1;
}
}
}

// 将信号处的值存入temp变量中,在信号元素后插入array[i]的值
temp = array[sign];
array[sign] = array[i];
count += 1;
// 交换值,使数组i前面且在sign后面的元素都向后移一位,且正好覆盖到i的位子
for (; sign < i; sign++) {
temp2 = array[sign + 1];
array[sign + 1] = temp;
temp = temp2;
count += 1;
}
}
}

System.out.println(count);

}

public static void main(String[] args) {

// 定义长度为100的数组
int[] arr = new int[100];
// 随机生成100个0-99的数
for (int i = 0; i < 100; i++) {
arr[i] = (int) (Math.random() * 100);
}
for (int i = 0; i < 100; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
binaryInsertSort(arr);

for (int i = 0; i < 100; i++) {
System.out.print(arr[i] + " ");
}

}

}

时间: 2024-08-16 23:26:16

9种排序算法 2_二分插入排序的相关文章

python几种排序算法和二分查找方法的实现

一.算法概念 - 含义:算法就是对问题进行处理且求解的一种实现思路或者思想. 评判程序优劣的方法 - 消耗计算机资源和执行效率(无法直观) 计算算法执行的耗时(不推荐,因为会受机器和执行环境的影响) 时间复杂度(推荐) 时间复杂度 - 评判规则:量化算法执行的操作/执行步骤的数量, - 如下列 def sumOfN(n): # 执行一步: theSum = 0 for i in range(1,n+1): # 下式一共执行n步,for循环不算一步,因为它是控制循环次数的 theSum = the

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

一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为采用折半比较,即可得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比较,就是在插入A[i]时,取A[i-1/2]的关键码值与A[i]的关键码值进行比较,如果A[i]的关键码值小于A[i-1/2]的关键码值,则说明A[i]只能插入A[0]到A[i-1/2]之间,故可以在A[0]到A[i-1/2-1]之间继续使用折半比较:否则只能插入A[i-1/2]到A[i-1]之间,故可

9种排序算法 1_直接插入排序

一 算法思想 每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止. 对于一个有n个元素的数组R,第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,....,第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,.....,第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列· 二 代码如下 p

四种排序算法与二分查找

1. 冒泡排序 func BubbleSort(slice []int) []int { i, j, okay, count := 0, 0, true, len(slice) for i = 0; i < count-1; i++ { //最多需要进行count-1轮比较 okay = true for j = 0; j < count-i-1; j++ { //每一轮比较的逻辑 if slice[j] > slice[j+1] { slice[j], slice[j+1] = sli

算法—比较两种排序算法:选择排序和插入排序

现在我们已经实现了两种排序算法,我们很自然地想知道选择排序和插入排序哪种更快.这里我们第一次用实践说明我们解决这个问题的办法. 性质:对于随机排序的无重复主键的数组,插入排序和选择排序的运行时间是平方级别的,两者之比应该是一个较小的常数. 例证:这个结论在过去的半个世纪中已经在许多不同类型的计算机上经过了验证.在1980年本书第一版完成之时插入排序就比选择排序快一倍,现在仍然是这样,尽管那时这些算法将10万条数据排序需要几个小时而现在只需要几秒钟.在你的计算机上插入排序也比选择排序快一些吗?可以

12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用

出处:http://blog.csdn.net/han_xiaoyang/article/details/12163251. 声明:版权所有,转载请注明出处,谢谢. 0.前言 从这一部分开始直接切入我们计算机互联网笔试面试中的重头戏算法了,初始的想法是找一条主线,比如数据结构或者解题思路方法,将博主见过做过整理过的算法题逐个分析一遍(博主当年自己学算法就是用这种比较笨的刷题学的,囧),不过又想了想,算法这东西,博主自己学的过程中一直深感,基础还是非常重要的,很多难题是基础类数据结构和题目的思想综

13种排序算法详解

0.前言 从这一部分开始直接切入我们计算机互联网笔试面试中的重头戏算法了,初始的想法是找一条主线,比如数据结构或者解题思路方法,将博主见过做过整理过的算法题逐个分析一遍(博主当年自己学算法就是用这种比较笨的刷题学的,囧),不过又想了想,算法这东西,博主自己学的过程中一直深感,基础还是非常重要的,很多难题是基础类数据结构和题目的思想综合发散而来.比如说作为最基本的排序算法就种类很多,而事实上笔试面试过程中发现掌握的程度很一般,有很多题目,包括很多算法难题,其母题或者基本思想就是基于这些经典算法的,

八种排序算法

最近一段时间自己在研究各种排序算法,于是自己写了一个八种排序算法的集合: /************************************************************************* > Copyright (c)2014 stay hungry,stay foolish !!! > File Name: sort.cpp > Author: kanty > Mail: [email protected] > Created Time:

数据结构中的7种排序算法

数据结构中的7种排序算法 排序是将一个记录的任意序列重新排列成一个按键值有序的序列. 时间复杂度主要考虑元素的移动次数. 结构如下: 1.直接插入排序 1,定义:依次将待排序序列中的每一个记录插入到一个已经排好序的序列中,直到全部记录都排好序. 2,时间复杂度:在最好情况下,待排序序列为正序,时间复杂度为O(n):最坏情况下,待排序序列为逆序,时间复杂度为O(n^2);平均情况下,时间复杂度为O(n^2). 3,空间复杂度:O(1). public static void insertSort(