java实现apriori算法_各种排序算法的分析及java实现(一)

03af9df0520f550cb626354e0f9e1c10.png

adabdd49e64b00bb607582cc9c6cec87.gif

阅读本文约需要7分钟

大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈)。上次老师跟大家分享了下用Navicat for Mysql导入.sql文件的相关知识,今天跟大家分享在 各种排序算法的分析及java实现(一)的知识。
参考来源:https://www.cnblogs.com/liuling/p/2013-7-24-01.html

新的一周又开始了,这周也要打起精神好好加油!今天我们开始了解排序。

排序大的分类可以分为两种:内排序和外排序。在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序。下面讲的排序都是属于内排序。

内排序有可以分为以下几类:

  (1)、插入排序:直接插入排序、二分法插入排序、希尔排序。

  (2)、选择排序:简单选择排序、堆排序。

  (3)、交换排序:冒泡排序、快速排序。

  (4)、归并排序

  (5)、基数排序 

一、插入排序

•思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置,直到全部插入排序完为止。

•关键问题:在前面已经排好序的序列中找到合适的插入位置。

•方法:

–直接插入排序

–二分插入排序

–希尔排序

①直接插入排序(从后向前找到合适位置后插入)

1、基本思想

每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置(从后向前找到合适位置后),直到全部插入排序完为止。

2、实例

  806e5b08d19a6f9df709fb4563ff9d90.png

 3、java实现

 package com.sort;    public class 直接插入排序 {      public static void main(String[] args) {          int[] a={49,38,65,97,76,13,27,49,78,34,12,64,1};          System.out.println("排序之前:");          for (int i = 0; i < a.length; i++) {              System.out.print(a[i]+" ");         }         //直接插入排序         for (int i = 1; i < a.length; i++) {             //待插入元素             int temp = a[i];             int j;             /*for (j = i-1; j>=0 && a[j]>temp; j--) {                 //将大于temp的往后移动一位                 a[j+1] = a[j];             }*/             for (j = i-1; j>=0; j--) {                 //将大于temp的往后移动一位                 if(a[j]>temp){                     a[j+1] = a[j];                 }else{                     break;                 }             }             a[j+1] = temp;         }         System.out.println();         System.out.println("排序之后:");         for (int i = 0; i < a.length; i++) {             System.out.print(a[i]+" ");         }     } }

4、分析

直接插入排序是稳定的排序。关于各种算法的稳定性分析可以参考

http://www.cnblogs.com/Braveliu/archive/2013/01/15/2861201.html
文件初态不同时,直接插入排序所耗费的时间有很大差异。若文件初态为正序,则每个待插入的记录只需要比较一次就能够找到合适的位置插入,故算法的时间复杂度为O(n),这时最好的情况。若初态为反序,则第i个待插入记录需要比较i+1次才能找到合适位置插入,故时间复杂度为O(n2),这时最坏的情况。直接插入排序的平均时间复杂度为O(n2)。

②二分法插入排序(按二分法找到合适位置插入)

  1、基本思想

二分法插入排序的思想和直接插入一样,只是找合适的插入位置的方式不同,这里是按二分法找到合适的位置,可以减少比较的次数。

  2、实例

5c0edaaf4f28eb9261a39e4fb96be079.png

  3、java实现

 package com.sort;  public class 二分插入排序 {      public static void main(String[] args) {          int[] a={49,38,65,97,176,213,227,49,78,34,12,164,11,18,1};          System.out.println("排序之前:");          for (int i = 0; i < a.length; i++) {              System.out.print(a[i]+" ");          }        //二分插入排序         sort(a);         System.out.println();         System.out.println("排序之后:");         for (int i = 0; i < a.length; i++) {             System.out.print(a[i]+" ");         }     }     private static void sort(int[] a) {         for (int i = 0; i < a.length; i++) {             int temp = a[i];             int left = 0;             int right = i-1;             int mid = 0;             while(left<=right){                 mid = (left+right)/2;                 if(temp                     right = mid-1;                 }else{                     left = mid+1;                 }             }             for (int j = i-1; j >= left; j--) {                 a[j+1] = a[j];             }             if(left != i){                 a[left] = temp;             }         }     } }

  4、分析

 当然,二分法插入排序也是稳定的。二分插入排序的比较次数与待排序记录的初始状态无关,仅依赖于记录的个数。当n较大时,比直接插入排序的最大比较次数少得多。但大于直接插入排序的最小比较次数。算法的移动次数与直接插入排序算法的相同,最坏的情况为n2/2,最好的情况为n,平均移动次数为O(n2)。

③希尔排序

 1、基本思想:

先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序。

然后,取第二个增量d2

  2、实例

04fd3dd5942ba27f5acdcfb39b1da1a6.png

 3、java实现

 package com.sort;  //不稳定  public class 希尔排序 {      public static void main(String[] args) {          int[] a={49,38,65,97,76,13,27,49,78,34,12,64,1};          System.out.println("排序之前:");         for (int i = 0; i < a.length; i++) {             System.out.print(a[i]+" ");         }         //希尔排序         int d = a.length;         while(true){             d = d / 2;             for(int x=0;x                 for(int i=x+d;i                     int temp = a[i];                     int j;                     for(j=i-d;j>=0&&a[j]>temp;j=j-d){                         a[j+d] = a[j];                     }                     a[j+d] = temp;                 }             }             if(d == 1){                 break;             }         }         System.out.println();         System.out.println("排序之后:");         for (int i = 0; i < a.length; i++) {             System.out.print(a[i]+" ");         }     } }

  4、分析

我们知道一次插入排序是稳定的,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以希尔排序是不稳定的。希尔排序的时间性能优于直接插入排序,原因如下:

(1)当文件初态基本有序时直接插入排序所需的比较和移动次数均较少。(2)当n值较小时,n和n2的差别也较小,即直接插入排序的最好时间复杂度O(n)和最坏时间复杂度0(n2)差别不大。(3)在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量di逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按di-1作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快。因此,希尔排序在效率上较直接插人排序有较大的改进。希尔排序的平均时间复杂度为O(nlogn)。

二、选择排序

•思想:每趟从待排序的记录序列中选择关键字最小的记录放置到已排序表的最前位置,直到全部排完。

•关键问题:在剩余的待排序记录序列中找到最小关键码记录。

•方法:

–直接选择排序

–堆排序

①简单的选择排序

  1、基本思想

在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。

  2、实例

5bb53eec127d70510a30447cebcaa3a2.png

  3、java实现

  package com.sort;  //不稳定  public class 简单的选择排序 {      public static void main(String[] args) {         int[] a={49,38,65,97,76,13,27,49,78,34,12,64,1,8};          System.out.println("排序之前:");          for (int i = 0; i < a.length; i++) {             System.out.print(a[i]+" ");         }         //简单的选择排序         for (int i = 0; i < a.length; i++) {             int min = a[i];             int n=i; //最小数的索引             for(int j=i+1;j                 if(a[j]                     min = a[j];                     n = j;                 }             }             a[n] = a[i];             a[i] = min;         }         System.out.println();         System.out.println("排序之后:");         for (int i = 0; i < a.length; i++) {             System.out.print(a[i]+" ");         }     } }

    4、分析

  简单选择排序是不稳定的排序。

 时间复杂度:T(n)=O(n2)。

②堆排序

 1、基本思想:

堆排序是一种树形选择排序,是对直接选择排序的有效改进。

堆的定义下:具有n个元素的序列 (h1,h2,...,hn),当且仅当满足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1) (i=1,2,...,n/2)时称之为堆。在这里只讨论满足前者条件的堆。

由堆的定义可以看出,堆顶元素(即第一个元素)必为最大项(大顶堆)。完全二 叉树可以很直观地表示堆的结构。堆顶为根,其它为左子树、右子树。

思想:初始时把要排序的数的序列看作是一棵顺序存储的二叉树,调整它们的存储序,使之成为一个 堆,这时堆的根节点的数最大。然后将根节点与堆的最后一个节点交换。然后对前面(n-1)个数重新调整使之成为堆。

依此类推,直到只有两个节点的堆,并对 它们作交换,最后得到有n个节点的有序序列。从算法描述来看,堆排序需要两个过程,一是建立堆,二是堆顶与堆的最后一个元素交换位置。所以堆排序有两个函数组成。一是建堆的渗透函数,二是反复调用渗透函数实现排序的函数。

  2、实例

初始序列:46,79,56,38,40,84建堆:

14328a27722e82a76c978aed6aec9367.png

   交换,从堆中踢出最大数

051f8de02604d25bd834b9e504c3de02.png

依次类推:最后堆中剩余的最后两个结点交换,踢出一个,排序完成。

  3、java实现

  package com.sort;  //不稳定  import java.util.Arrays;  public class HeapSort {      public static void main(String[] args) {          int[] a={49,38,65,97,76,13,27,49,78,34,12,64};          int arrayLength=a.length;            //循环建堆           for(int i=0;i             //建堆               buildMaxHeap(a,arrayLength-1-i);               //交换堆顶和最后一个元素               swap(a,0,arrayLength-1-i);               System.out.println(Arrays.toString(a));           }       }     //对data数组从0到lastIndex建大顶堆     public static void buildMaxHeap(int[] data, int lastIndex){          //从lastIndex处节点(最后一个节点)的父节点开始          for(int i=(lastIndex-1)/2;i>=0;i--){             //k保存正在判断的节点             int k=i;             //如果当前k节点的子节点存在              while(k*2+1<=lastIndex){                 //k节点的左子节点的索引                  int biggerIndex=2*k+1;                 //如果biggerIndex小于lastIndex,即biggerIndex+1代表的k节点的右子节点存在                 if(biggerIndex                     //若果右子节点的值较大                       if(data[biggerIndex]                         //biggerIndex总是记录较大子节点的索引                           biggerIndex++;                       }                   }                   //如果k节点的值小于其较大的子节点的值                   if(data[k]                     //交换他们                       swap(data,k,biggerIndex);                       //将biggerIndex赋予k,开始while循环的下一次循环,重新保证k节点的值大于其左右子节点的值                       k=biggerIndex;                   }else{                       break;                   }               }         }     }     //交换     private static void swap(int[] data, int i, int j) {           int tmp=data[i];           data[i]=data[j];           data[j]=tmp;       }  }

  4、分析

堆排序也是一种不稳定的排序算法。

堆排序优于简单选择排序的原因:

直接选择排序中,为了从R[1..n]中选出关键字最小的记录,必须进行n-1次比较,然后在R[2..n]中选出关键字最小的记录,又需要做n-2次比较。

事实上,后面的n-2次比较中,有许多比较可能在前面的n-1次比较中已经做过,但由于前一趟排序时未保留这些比较结果,所以后一趟排序时又重复执行了这些比较操作。

堆排序可通过树形结构保存部分比较结果,可减少比较次数。

堆排序的最坏时间复杂度为O(nlogn)。堆序的平均性能较接近于最坏性能。由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。

今天就分享这么多,关于各种排序算法的分析及java实现(一),你学会了多少?欢迎在留言区评论,对于有价值的留言,我们都会一一回复的。如果觉得文章对你有一丢丢帮助,请点右下角【在看】,让更多人看到该文章。如果有想了解的,也可以进行留言

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超越杭州、北京居首、广州晋级第一梯队……国内城市算力大起底!

戳蓝字“CSDN云计算”关注我们哦&#xff01;近日&#xff0c;在2019中国人工智能计算大会&#xff08;AICC2019&#xff09;上&#xff0c;IDC与浪潮联合发布了《2019-2020中国人工智能计算力发展评估报告》。报告指出&#xff0c;计算力是承载和推动人工智能走向实际应用的基…

在阿里,我们如何管理代码分支?

摘要&#xff1a; 阿里有很多的研发团队&#xff0c;不同事业部使用的发布流程、分支策略并非整齐划一&#xff0c;但总体上看是比较规整的。其中有一种主流的发布模式以及对应的分支使用方式&#xff0c;称为“AoneFlow”。这套工作模式思路独特&#xff0c;在阿里以外的地方并…

linux杀掉80端口线程命令

80端口被其他程序占用&#xff0c; fuser -k -n tcp 80 查看端口是否启用 telnet ip地址 端口没有启动&#xff0c;显示拒绝&#xff1a; 端口启动&#xff0c;显示微笑&#xff1a;

.ne中的控制器循环出来的数据如何显示在视图上_【asp.net core 系列】3 视图以及视图与控制器...

0.前言 在之前的几篇中&#xff0c;我们大概介绍了如何创建一个http://asp.net core mvc项目以及http请求如何被路由转交给对应的执行单元。这一篇我们将介绍一下控制器与视图直接的关系。 1. 视图 这里的视图不是数据库里的视图&#xff0c;是一种展示技术。在http://asp.net …

为了让开发者写MaxCompute SQL更爽,DataWorks 增强SQL 编辑器功能

摘要&#xff1a; 众所周知&#xff0c;数据开发和分析的同学每天都要花大量时间写MaxCompute SQL&#xff1b;Dataworks作为数据开发的IDE直接影响着大家的开发效率&#xff0c;这次新上线的Dataworks我们在编辑体验上做了很多工作&#xff0c;在前端实现MaxCompute SQL和编辑…

看懂“大数据”,这一篇就够了!

戳蓝字“CSDN云计算”关注我们哦&#xff01;来源 | 鲜枣课堂作者 | 小枣君近年来&#xff0c;大数据这个词的热度很高&#xff0c;受到公众的广泛关注。对于很多人来说&#xff0c;当他第一次听到“大数据”这个词&#xff0c;会自然而然从字面上去理解——认为大数据就是大量…

服务器漏洞处理_wildfly禁用https和8443端口

文章目录一、https和84431. 问题分析1.1. https1.2. 8443端口2. 思路预测3. 解决方案一、https和8443 1. 问题分析 1.1. https 从以上2个漏洞分析&#xff0c;都和8443端口有关&#xff0c;而8443是https的端口&#xff0c;由此分析&#xff0c;和https有关。 1.2. 8443端口…

阿里云MaxCompute被Forrester评为全球云端数据仓库领导者

摘要&#xff1a; 参考消息网3月19日报道 日前&#xff0c;全球权威调研机构佛瑞斯特研究公司&#xff08;Forrester&#xff09;发布《2018年一季度云端数据仓库》报告。报告对大数据服务商的主要功能、区域表现、细分市场和典型客户等进行了全面评估&#xff0c;最终AWS、阿里…

npoi 所有列调整为一页_别再浪费纸了,一张纸就能打印Word、Excel、PPT所有内容,真厉害...

前几天公司的行政小姐姐在整理打印的废纸&#xff0c;不整理不知道&#xff0c;一整理&#xff0c;一个星期浪费的打印纸有几千张&#xff01;&#xff01;&#xff01;现在可是提倡环保啊~这不&#xff0c;现在已经规定每人的打印纸张了&#xff0c;杜绝浪费&#xff0c;从节约…

【HBase从入门到精通系列】如何避免HBase写入过快引起的各种问题

摘要&#xff1a; 首先我们简单回顾下整个写入流程 client api > RPC > server IPC > RPC queue > RPC handler > write WAL > write memstore > flush to filesystem 整个写入流程从客户端调用API开始&#xff0c;数据会通过protobuf编码成一个请求&…

怎么加载csv_python爬虫入门实战(四)!爬取动态加载的页面

今天的主题是爬取动态网页的经验分享&#xff0c;以cocos论坛为例子进行分享。(官方不会打我吧 )配置环境为什么选择cocos论坛呢&#xff1f;因为自己在浏览论坛时&#xff0c;发现标题内容会随着滚动条的位置而动态添加。环境: python3 requests 。还要引入几个系统库。参考如…

再谈全局网HBase八大应用场景

摘要&#xff1a; HBase可以说是一个数据库&#xff0c;也可以说是一个存储。拥有双重属性的HBase天生就具备广阔的应用场景。在2.0中&#xff0c;引入了OffHeap降低了延迟&#xff0c;可以满足在线的需求。引入MOB&#xff0c;可以存储10M左右的对象&#xff0c;完全适应了对象…

文件标识符必须为双精度类型的整数值标量_数据类型

标识符在Java中&#xff0c;标识符多用于类名、方法、字段、变量和包名等&#xff0c;他的命名方式需遵循以下规则&#xff1a;1、标识符可以由字母、数字、__、$组成&#xff0c;但不能包含&#xff01;、#、%、空格等其他特殊字符。2、标识符的命名最好做到见名知意。3、不能…

MSSQL · 最佳实践 · 利用文件组实现冷热数据隔离备份方案

摘要&#xff1a; 摘要 在SQL Server备份专题分享中&#xff0c;前四期我们分享了&#xff1a;三种常见的数据库备份、备份策略的制定、如何查找备份链以及数据库的三种恢复模式与备份之间的关系。本次月报我们分享SQL Server如何利用文件组技术来实现数据库冷热数据隔离备份的…

检测到会话cookie中缺少HttpOnly属性

解决方案01&#xff1a;在会话cookie中添加HttpOnly属性 具体操作步骤如下&#xff1a; HttpServletResponse response2 (HttpServletResponse)response; response2.setHeader( "Set-Cookie", "namevalue; HttpOnly");解决方案02&#xff08;建议使用&am…

刷抖音看到 Python 工程师的工资条后,我沉默了...

戳蓝字“CSDN云计算”关注我们哦&#xff01;最近无意中刷抖音刷到了一个Python工程师的工资条然后我默默的打开看了然后我默默的关闭了emmm.....后悔为什么我当时没有坚持做开发相信每一个人都想拿着高工资做着轻松的工作而如今Python技术盛行大家都纷纷学Python我不能跟你确保…

怎么将sql语句转化成语法树_数据库如何解析执行SQL

阅读文本大概需要3分钟。0x01&#xff1a;数据库客户端发送查询SQL客户端将查询的select sql&#xff0c;按照mysql通信协议传输到数据库服务。数据库服务接受查询sql&#xff0c;执行sql前判断要执行的sql是否是查询语句。0x02&#xff1a;查询缓存先行MySQL在开启查询缓存的情…

佛系程序员的月薪五万指南

摘要&#xff1a; 大师&#xff1a;很简单&#xff0c;我这里有一份佛系月薪 5 万指南&#xff0c;我看你骨骼清奇、脑门光亮&#xff0c;一看就是将要大富大贵之人&#xff0c;这份指南可以助你快速实现小目标&#xff01;程序员问大师…… 青年&#xff1a;大师&#xff0c;你…

数据用压缩 bcd 码 java_IT职场新人选python,go还是java?用数据来说话

最近有读者在后台问&#xff0c;刚参加工作&#xff0c;想选一个职业方法&#xff0c;问我现在python很火&#xff0c;但是貌似就业机会不是很多&#xff0c;所以比较纠结现在到底是学python,go还是java. 所以我就想我们能不能用数据说话&#xff0c;看看python,go,java这三种热…

点击劫持:X-Frame-Options未配置

解决方案&#xff1a;设置X-Frame-Options参数即可 具体操作步骤如下&#xff1a; 在上面filter基础上添加即可解决 httpResp.addHeader("x-frame-options","DENY");附上源码&#xff1a; package com.sinosoft.fis.util;import java.io.IOException; im…