本文实例讲述了java数据结构与算法之插入排序。分享给大家供大家参考,具体如下:

复习之余,就将数据结构中关于排序的这块知识点整理了一下,写下来是想与更多的人分享,最关键的是做一备份,为方便以后查阅。
排序
1、概念:
有n个记录的序列{R1,R2,.......,Rn}(此处注意:1,2,n 是下表序列,以下是相同的作用),其相应关键字的序列是{K1,K2,.........,Kn}。通过排序,要求找出当前下标序列1,2,......,n的一种排列p1,p2,........pn,使得相应关键字满足如下的非递减(非递增)关系,即:Kp1<=Kp2<=Kpn,这样就得到一个按关键字有序的记录序列:{Rp1,Rp2,.......,Rpn}。
2、分类
根据排序时数据所占用存储器的不同,可将排序分为两类。
内部排序:整个排序过程完全在内存中进行,如下:
插入类排序(直接插入排序、折半插入排序、希尔排序);
交换类排序(冒泡排序、快速排序);
选择类排序(简单选择排序、树型选择排序、堆排序);
归并排序;
分配类排序(多关键字排序、链式基数排序、基数排序的顺序表实现));
外部排序:由于待排序记录数据量太大,内存无法容纳全部数据,排序需要借助外部存储设备才能完成(磁盘排序,磁带排序)。
3、稳定性
假设在待排序的序列中存在多个具有相同关键字的记录。设Ki=Kj(1<=i<=n,1<=j<=n,i != j),若在排序前的序列中Ri领先与Rj(即i<=j),经过排序后得到的序列中Ri仍然领先与Rj,则称所用的排序方法是稳定的;反之,当相同关键字的领先关系在排序过程中发生变化,则所用的排序方法是不稳定的。
插入排序:
思想:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。
直接插入排序:
算法思想:假设待排序的记录存放在数组R[1..n]中。初始时,R[1]自成1个有序区,无序区为R[2..n]。从i=2起直至i=n为止,依次将R[i]插入当前的有序区R[1..i-1]中,生成含n个记录的有序区。
用java实现的代码如下:
package exp_sort;
public class DirectInsertSort {
public static void DircstSort(int array[]) {
int j;
// 循环从第二个数开始,第一个数用做存放待插入的记录
for (int i = 1; i < array.length; i++) {
int temp = array[i];
// 寻找插入位置
for (j = i; j > 0 && temp < array[j - 1]; j--) {
array[j] = array[j - 1];
}
// 将待插入记录插入到已经排序的序列中
array[j] = temp;
}
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
System.out.println("\n");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int array[] = { 38, 62, 35, 77, 55, 14, 35, 98 };
DircstSort(array);
}
}
算法分析:最好的情况是待排序记录本身已经按照关键字有序排列,最坏的情况是待排序记录是按照关键字逆序排列的;时间复杂度是O(N^2),空间复杂度是O(1);该算法是稳定的排序算法:比较适用于待排序记录数目较少且基本有序的情况。
折半插入排序:
算法思想:对于有序表进行折半查找,其性能优于顺序查找。
算法实现代码如下:
package exp_sort;
public class BinaryInsertSort {
public static void sort(int array[]) {
int temp, low, mid, high;
for (int i = 1; i < array.length; i++) {
temp = array[i];
low = 0;
high = i -1;
//确定插入位置
while (low <= high) {
mid = (low + high) / 2;
if (temp < array[mid]) {
high = mid - 1;
} else {
low = mid + 1;
}
}
//记录依次向后移动
for (int j = i; j >= low + 1; j--) {
array[j] = array[j-1];
}
//插入记录
array[low] = temp;
}
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
System.out.println("\n");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int array[] = {38, 62, 35, 77, 55, 14, 35, 98};
sort(array);
}
}
算法分析:是一种稳定的排序算法,比直接插入算法明显减少了关键字之间比较的次数,因此速度比直接插入排序算法快,但记录移动的次数没有变,所以折半插入排序算法的时间复杂度仍然为O(n^2),与直接插入排序算法相同。附加空间O(1)。
更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
# java
# 数据结构
# 算法
# 插入排序
# java数据结构之插入排序
# javascript数据结构之双链表插入排序实例详解
# Java数据结构及算法实例:插入排序 Insertion Sort
# java数据结构之希尔排序
# java 数据结构基本算法希尔排序
# Java数据结构之插入排序与希尔排序
# 链式
# 希尔
# 的是
# 操作技巧
# 是一种
# 放在
# 相关内容
# 最好的
# 多个
# 适用于
# 感兴趣
# 太大
# 给大家
# 之余
# 这块
# 就将
# 可将
# 不稳定
# 较少
相关文章:
定制建站策划方案_专业建站与网站建设方案一站式指南
为什么Go需要go mod文件_Go go mod文件作用说明
孙琪峥织梦建站教程如何优化数据库安全?
如何快速查询域名建站关键信息?
如何规划企业建站流程的关键步骤?
建站之星后台密码遗忘如何找回?
外贸公司网站制作哪家好,maersk船公司官网?
建站之星CMS五站合一模板配置与SEO优化指南
建站之星图片链接生成指南:自助建站与智能设计教程
桂林网站制作公司有哪些,桂林马拉松怎么报名?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
网站制作软件有哪些,制图软件有哪些?
已有域名和空间如何搭建网站?
湖州网站制作公司有哪些,浙江中蓝新能源公司官网?
,制作一个手机app网站要多少钱?
一键制作网站软件下载安装,一键自动采集网页文档制作步骤?
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
如何在IIS中新建站点并解决端口绑定冲突?
如何基于PHP生成高效IDC网络公司建站源码?
常州自助建站:操作简便模板丰富,企业个人快速搭建网站
免费制作小说封面的网站有哪些,怎么接网站批量的封面单?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
建站之星后台管理:高效配置与模板优化提升用户体验
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
红河网站制作公司,红河事业单位身份证如何上传?
制作网站怎么制作,*游戏网站怎么搭建?
北京企业网站设计制作公司,北京铁路集团官方网站?
如何通过远程VPS快速搭建个人网站?
安云自助建站系统如何快速提升SEO排名?
建站主机是否等同于虚拟主机?
相册网站制作软件,图片上的网址怎么复制?
网站制作知乎推荐,想做自己的网站用什么工具比较好?
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
如何快速搭建虚拟主机网站?新手必看指南
,南京靠谱的征婚网站?
建站之星如何开启自定义404页面避免用户流失?
网站微信制作软件,如何制作微信链接?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
北京网站制作的公司有哪些,北京白云观官方网站?
建站org新手必看:2024最新搭建流程与模板选择技巧
子杰智能建站系统|零代码开发与AI生成SEO优化指南
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
太原网站制作公司有哪些,网约车营运证查询官网?
建站之星24小时客服电话如何获取?
如何快速上传建站程序避免常见错误?
如何在企业微信快速生成手机电脑官网?
制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?
*请认真填写需求信息,我们会在24小时内与您取得联系。