- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java经典排序算法之插入排序由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1、算法原理 。
插入排序法:所谓插入排序法乃是将一个数目插入该占据的位置.
假设我们输入的是 “53,27,36,15,69, 42” 我们从第二个数字开始,这个数字是27,我们的任务只要看看27有没有正确的位置,我们的做法是和这个数字左边的数字来比,因此我们比较27和53,27比53小,所以我们就交换27和53,原来的排列就变成了“27, 53, 36, 15, 69, 42 ” 。
接下来,我们看第3个数字有没有在正确的位置。这个数字是36,它的左边数字是53,36比53小,所以我们将36和53交换,排列变成了 “27,36, 53, 15, 69, 42 "我们必须继续看36有没有在正确的位置,36的左边是27,27比36小,36就维持不动了,这时候排序还是“27, 36, 53, 15, 69, 42 ".
再来看第四个数字,这个数字是15,我们将15和它左边的数字相比,都比15大,所以就将15一路往左移动,这时候排序变成了 “15, 27, 36, 53, 69, 42 ”.
再来看第五个数字,这个数字是69,我们将69和它左边的数字相比,都比69小,所以就69维持不动了,这时候排序变成了 “15, 27, 36, 53, 69, 42 ” 。
最后,我们检查第六个数字,这个数字是42,42必须往左移,一直移到42的左边是36为止,所以我们的排列就变成了 “15, 27, 36, 42 ,53, 69”排序因此完成了.
ps:读者也可以自己打开下面的链接,自己设定要排序的数组,进行排序演练 直接插入排序动画演示 。
所谓插入排序法,就是检查第i个数字,如果在它的左边的数字比它大,进行交换,这个动作一直继续下去,直到这个数字的左边数字比它还要小,就可以停止了。插入排序法主要的回圈有两个变数:i和j,每一次执行这个回圈,就会将第i个数字放到左边恰当的位置去.
2、算法描述 。
1、从第一个元素开始,该元素可以认为已经被排序。 2、取出下一个元素,在已经排序的元素序列中从后向前扫描。 3、如果该元素(已排序)大于新元素,则将该元素移到下一位置。 4、重复步骤3,直到找到已排序的元素小于或者大于新元素的位置。 5、将新元素插入到该位置。 6、重复步骤2.
3、效率分析 。
如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况如下。 最好情况:序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。 最坏情况:序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。 直接插入排序属于稳定的排序,最坏时间复杂度为O(n^2),最好时间复杂度为O(n),空间复杂度为O(1)。 插入排序的赋值操作是比较操作的次数加上(n-1)次。 因此,插入排序不适合对于数据量比较大的排序应用.
4、代码实现 。
。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
public
class
InsertSortTest {
public
static
void
InsertSort(
int
[] source) {
int
i, j;
int
insertNode;
// 要插入的数据
// 从数组的第二个元素开始循环将数组中的元素插入
for
(i =
1
; i < source.length; i++) {
// 设置数组中的第2个元素为第一次循环要插入的数据
insertNode = source[i];
j = i -
1
;
// 如果要插入的元素小于第j个元素,就将第j个元素向后移
while
((j >=
0
) && insertNode < source[j]) {
source[j +
1
] = source[j];
j--;
}
// 直到要插入的元素不小于第j个元素,将insertNote插入到数组中
source[j +
1
] = insertNode;
System.out.print(
"第"
+ i +
"趟排序:"
);
printArray(source);
}
}
private
static
void
printArray(
int
[] source) {
for
(
int
i =
0
; i < source.length; i++) {
System.out.print(
"\t"
+ source[i]);
}
System.out.println();
}
public
static
void
main(String[] args) {
int
source[] =
new
int
[] {
53
,
27
,
36
,
15
,
69
,
42
};
System.out.print(
"初始关键字:"
);
printArray(source);
System.out.println(
""
);
InsertSort(source);
System.out.print(
"\n\n排序后结果:"
);
printArray(source);
}
}
|
5、运行结果 。
1
2
3
4
5
6
7
8
9
10
|
初始关键字:
53
27
36
15
69
42
第
1
趟排序:
27
53
36
15
69
42
第
2
趟排序:
27
36
53
15
69
42
第
3
趟排序:
15
27
36
53
69
42
第
4
趟排序:
15
27
36
53
69
42
第
5
趟排序:
15
27
36
42
53
69
排序后结果:
15
27
36
42
53
69
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:http://blog.csdn.net/ouyang_peng/article/details/46547091 。
最后此篇关于Java经典排序算法之插入排序的文章就讲到这里了,如果你想了解更多关于Java经典排序算法之插入排序的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
本文实例总结了常用SQL语句优化技巧。分享给大家供大家参考,具体如下: 除了建立索引之外,保持良好的SQL语句编写习惯将会降低SQL性能问题发生。 ①通过变量的方式来设置参数 好:
写CSS的同学们往往会体会到,随着项目规模的增加,项目中的CSS代码也会越来越多,如果没有及时对CSS代码进行维护,CSS代码不断会越来越多。CSS代码交错复杂,像一张庞大的蜘蛛网分布在网站的各个位
所以我必须解决类的背包问题。到目前为止,我想出了以下内容。我的比较器是确定两个主题中哪一个是更好选择的函数(通过查看相应的(值,工作)元组)。 我决定迭代工作量小于 maxWork 的可能主题,并且为
前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级
代码如下: 复制代码代码如下: USE [tempdb] GO /****** Object: UserDefinedFunction [dbo].[fun
最近收到一个工作要求,让我完成一个每天一次的Linux服务器巡检工作(服务器的版本为红帽6.4),不可以使用监控软件来操作。在这里,把我的巡检过程和巡检脚本放送给大家做一参考。 首先,巡检内容
可以在 Classic ASP 中动态创建“空”对象并创建对象属性吗? 以这个 JavaScript 示例为例: var sample = new Object(); sample.prop = "O
我正在向旧的经典 asp 站点添加功能,但遇到了一个有趣的问题。页面上的以下行导致有用的错误“需要对象:''” strServerName = Request.ServerVariables("ser
我有一个经典的 ASP 应用程序,我正在处理日期截止。我的服务器位于中部时间,但我在东部时间。发生的情况是我的应用程序认为它早了一个小时,而我的截止时间晚了一个小时。我敢肯定,如果用户在太平洋时间,他
我是经典 ASP 的初学者。需要拆分一个由逗号分隔的许多电子邮件组成的字符串,并使用稍后生成的附加代码将结果插入(逐个电子邮件)到表格中。每条记录都应该有一个电子邮件地址。问题是我陷入了数组范围错误。
这个问题已经有答案了: one condition, multiple events (2 个回答) 已关闭 6 年前。 如何用更小的语句替换 1,2,3..。我尝试将 1 放入 10,但显示错误。
我是 ExtJS 的新手,所以我不知道是否可能。 Google 只回答如何为图表制作工具提示,所以... 我需要制作一个带有工具提示的网格,当用户将鼠标放在单元格上时将显示该工具提示。在该工具提示中,
我正在使用一个非常奇怪的 VB 版本...它不需要我告诉它什么是什么,它想自己弄清楚。 在 C# 中,我可以轻松地对数组进行硬编码...在 VB 中则不然。 我想在调用函数时创建一个硬编码数组...但
我的数据库访问代码如下: set recordset = Server.CReateObject("ADODB.Recordset") set cmd1 = Server.CreateObject(
我有 html 按钮和文本框的代码:文本框是我输入文本的地方,以便我可以在表格上进行一些更改。 'textbox " /> 'button Clear 我现在需要做的是单击“清除”按
我有一个表单,提交后会通过电子邮件发送。该表单使用 JavaScript 进行验证。经典 ASP 处理表单,即获取输入的数据、创建然后发送电子邮件。有报道称正在提交空白表格。仅发送标题和 Logo 。
加载页面 A.asp 默认情况下正在执行,从那里开始执行电子邮件的情况,如果是电子邮件,我们将调用页面 B。我想在控件被执行时执行相同的电子邮件情况从页面 B 转移到页面 A。请帮助我。 Page A
我正在使用经典 ASP 开发一个项目,例如,我想添加一些用户作为临时列表,当我提交表单时,这些数据将保存到数据库中。 我知道如何在 asp.net 中使用它,但不知道如何在经典 asp 中使用它。 例
我有一个带有简单 html 表的经典 ASP 页面,我想根据从数据库中提取的未知数量的记录循环表行,但是,当我使用 do/while 循环循环记录时,我收到一条错误消息,指出 Either BOF o
嘿,一直在寻找一段时间,但我似乎找不到任何有关如何在经典 asp 中处理日期的信息。 现在,我需要一种方法来计算今年过去的天数。我正在考虑一个简单的函数,它将获取当前日期,然后使用 (day = 1,
我是一名优秀的程序员,十分优秀!