重学数据结构和算法(四)之冒泡排序、插入排序、选择排序

目录
  • 排序
    • 冒泡排序(Bubble Sort)
    • 插入排序(Insertion Sort)
      • 二分法插入排序
      • 希尔排序(O(n^1.3))
    • 选择排序(Selection Sort)

最近学习了极客时间的《数据结构与算法之美》很有收获,记录总结一下。
欢迎学习老师的专栏:数据结构与算法之美
代码地址:http://github.com/peiniwan/Arithmetic

排序

我们知道,时间复杂度反应的是数据规模 n 很大的时候的一个增长趋势,所以它表示的时候会忽略系数、常数、低阶。但是实际的软件开发中,我们排序的可能是 10 个、100 个、1000 个这样规模很小的数据,所以,在对同一阶时间复杂度的排序算法性能对比的时候,我们就要把系数、常数、低阶也考虑进来。

基于比较的排序算法的执行过程,会涉及两种操作,一种是元素比较大小,另一种是元素交换或移动。所以,如果我们在分析排序算法的执行效率的时候,应该把比较次数和交换(或移动)次数也考虑进去。

排序算法的内存消耗
算法的内存消耗可以通过空间复杂度来衡量,排序算法也不例外。不过,针对排序算法的空间复杂度,我们还引入了一个新的概念,原地排序(Sorted in place)。原地排序算法,就是特指空间复杂度是 O(1) 的排序算法。冒泡、插入、选择,都是原地排序算法

排序算法的稳定性
针对排序算法,我们还有一个重要的度量指标,稳定性。这个概念是说,如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变。
我通过一个例子来解释一下。比如我们有一组数据 2,9,3,4,8,3,按照大小排序之后就是 2,3,3,4,8,9。这组数据里有两个 3。
经过某种排序算法排序之后,如果两个 3 的前后顺序没有改变,那我们就把这种排序算法叫作稳定的排序算法;如果前后顺序发生变化,那对应的排序算法就叫作不稳定的排序算法。

稳定排序算法可以保持金额相同的两个对象,在排序之后的前后顺序不变

  • 稳定排序有:插入排序,基数排序,归并排序 ,冒泡排序 ,基数排序。
  • 不稳定的排序算法有:快速排序,希尔排序,简单选择排序,堆排序。
  • 排序的稳定性,就是指,在对a关键字排序后会不会改变其他关键字的顺序。

冒泡排序(Bubble Sort)

稳定、原地排序
我们要对一组数据 4,5,6,3,2,1,从小到大进行排序。经过一次冒泡操作之后,6 这个元素已经存储在正确的位置上。要想完成所有数据的排序,我们只要进行 6 次这样的冒泡操作就行了。

实际上,刚讲的冒泡过程还可以优化。当某次冒泡操作已经没有数据交换时,说明已经达到完全有序,不用再继续执行后续的冒泡操作。我这里还有另外一个例子,这里面给 6 个元素排序,只需要 4 次冒泡操作就可以了。

// 冒泡排序,a表示数组,n表示数组大小
public void bubbleSort(int[] a, int n) {
  if (n <= 1) return;
 
 for (int i = 0; i < n; ++i) {
    // 提前退出冒泡循环的标志位
    boolean flag = false;
    for (int j = 0; j < n - i - 1; ++j) { //-x:比较元素减少,-1:避免角标越界  
      if (a[j] > a[j+1]) { // 交换
        int tmp = a[j];
        a[j] = a[j+1];
        a[j+1] = tmp;
        flag = true;  // 表示有数据交换      
      }
    }
    if (!flag) break;  // 没有数据交换,提前退出
  }
}

插入排序(Insertion Sort)

稳定、原地排序
基本思想是每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。

一个有序的数组,我们往里面添加一个新的数据后,如何继续保持数据有序呢?很简单,我们只要遍历数组,找到数据应该插入的位置将其插入即可。

这是一个动态排序的过程,即动态地往有序集合中添加数据,我们可以通过这种方法保持集合中的数据一直有序。而对于一组静态数据,我们也可以借鉴上面讲的插入方法,来进行排序,于是就有了插入排序算法。

插入排序具体是如何借助上面的思想来实现排序的呢?

首先,我们将数组中的数据分为两个区间,已排序区间和未排序区间。初始已排序区间只有一个元素,就是数组的第一个元素。插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入,并保证已排序区间数据一直有序。重复这个过程,直到未排序区间中元素为空,算法结束。

要排序的数据是 4,5,6,1,3,2,其中左侧为已排序区间,右侧是未排序区间。

插入排序也包含两种操作,一种是元素的比较,一种是元素的移动。
当我们需要将一个数据 a 插入到已排序区间时,需要拿 a 与已排序区间的元素依次比较大小,找到合适的插入位置。找到插入点之后,我们还需要将插入点之后的元素顺序往后移动一位,这样才能腾出位置给元素 a 插入。

// 插入排序,a表示数组,n表示数组大小
public void insertionSort(int[] a, int n) {
  if (n <= 1) return;

  for (int i = 1; i < n; ++i) {
      //待插入元素
    int value = a[i];
    int j = i - 1;
    // 查找插入的位置
    for (; j >= 0; --j) {
      if (a[j] > value) {
        a[j+1] = a[j];  // 数据移动,将大于temp的往后移动一位
      } else {
        break;
      }
    }
    a[j+1] = value; // 插入数据
  }
}

插入排序和冒泡排序的时间复杂度相同,都是 O(n2),在实际的软件开发里,为什么我们更倾向于使用插入排序算法而不是冒泡排序算法呢?
冒泡排序的数据交换要比插入排序的数据移动要复杂,冒泡排序需要 3 个赋值操作,而插入排序只需要 1 个。我们来看这段操作:冒泡排序中数据的交换操作:

冒泡排序中数据的交换操作:
if (a[j] > a[j+1]) { // 交换
   int tmp = a[j];
   a[j] = a[j+1];
   a[j+1] = tmp;
   flag = true;
}

插入排序中数据的移动操作:
if (a[j] > value) {
  a[j+1] = a[j];  // 数据移动
} else {
  break;
}

我们把执行一个赋值语句的时间粗略地计为单位时间(unit_time),然后分别用冒泡排序和插入排序对同一个逆序度是 K 的数组进行排序。用冒泡排序,需要 K 次交换操作,每次需要 3 个赋值语句,所以交换操作总耗时就是 3* K 单位时间。而插入排序中数据移动操作只需要 K 个单位时间。

二分法插入排序

二分法插入排序是在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们中间的那个元素比,如果小,则对前半再进行折半,否则对后半进行折半,直到left>right,然后以左下标为标准,左及左后边全部后移,然后左位置前插入该数据。

二分法没有排序,只有查找。所以当找到要插入的位置时。移动必须从最后一个记录开始,向后移动一位,再移动倒数第2位,直到要插入的位置的记录移后一位。

    private static void sort(int[] a) {
        // {4, 6, 8, 7, 3, 5, 9, 1}
        // {4, 6, 7, 8, 3, 5, 9, 1}
        for (int i = 1; i < a.length; i++) {
            int temp = a[i];//7
            int left = 0;
            int right = i - 1;//2
            int mid = 0;
            //确定(找到)要插入的位置
            while (left <= right) {
                //先获取中间位置
                mid = (left + right) / 2;
                if (temp < a[mid]) {
                    //如果值比中间值小,让right左移到中间下标-1,舍弃右边
                    right = mid - 1;
                } else {//7  6
                    //如果值比中间值大,让left右移到中间下标+1,舍弃左边
                    left = mid + 1;//2
                }
            }
            for (int j = i - 1; j >= left; j--) {
                //以左下标为标准,左及左后边全部后移,然后左位置前插入该数据。
                a[j + 1] = a[j];
            }
            if (left != i) {//如果相等,不需要移动
                //左位置插入该数据
                a[left] = temp;
            }
        }
    }

希尔排序(O(n^1.3))

  • 希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。
  • 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
  • 先取一个小于n的整数d1作为第一个增量,把数组的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量 =1( < …<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
    public void heer(int[] a) {
        int d = a.length / 2;//默认增量
        while (true) {
            for (int i = 0; i < d; i++) {
                for (int j = i; j + d < a.length; j += d) {
                    //i=0  j=0,4
                    //i=1  j=1,5
                    int temp;
                    if (a[j] > a[j + d]) {
                        temp = a[j];
                        a[j] = a[j + d];
                        a[j + d] = temp;
                    }
                }
            }
            if (d == 1) {
                break;
            }
            d--;
        }
    }

选择排序(Selection Sort)

基本思想为每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止
选择排序算法的实现思路有点类似插入排序,也分已排序区间和未排序区间。但是选择排序每次会从未排序区间中找到最小的元素,将其放到已排序区间的末尾。

那选择排序是稳定的排序算法吗?
比如 5,8,5,2,9 这样一组数据,使用选择排序算法来排序的话,第一次找到最小元素 2,与第一个 5 交换位置,那第一个 5 和中间的 5 顺序就变了,所以就不稳定了。正是因此,相对于冒泡排序和插入排序,选择排序就稍微逊色了。

    public void selectSort(int[] array) {
        int min;
        int tmp;
        for (int i = 0; i < array.length; i++) {
            min = array[i];
            //里面for第一次出来0,并且排在最前面,然后从i=1开始遍历
            for (int j = i; j < array.length; j++) {
                if (array[j] < min) {
                    min = array[j];//记录最小值  3
                    tmp = array[i];//9
                    array[i] = min;//3
                    array[j] = tmp;//9
                }
            }
        }
        for (int num : array) {
            System.out.println(num);
        }
    }
本文转载于网络 如有侵权请联系删除

相关文章

  • SAP 采购订单收货后不能修改价格的增强

    采购订单收货后不能修改价格的增强增强名:MM06E005出口:EXIT_SAPMM06E_012IFSY-TCODE<>'ME22N'ANDSY-TCODE<>'ME22'ANDSY-TCODE<>'ME23N'ANDSY-TCODE<>'ME23'. EXIT. ENDIF. DATAT_NETPRTYPEEKPO-NETPR. DATATT_SUMTYPEEKBE-BPMNG. DATAT_SUMTYPEEKBE-BPMNG. DATAT_SHKZGTYPEEKBE-SHKZG. LOOPATTEKPO.SELECTSINGLENETPRINTOT_NETPRFROMEKPOWHEREEBELN=TEKPO-EBELN ANDEBELP=TEKPO-EBELP.IFTEKPO-NETPR<>T_NETPR. SELECTBPMNGSHKZGINTO(T_SUM,T_SHKZG)FROMEKBEWHEREEBELN=TEKPO-EBELN AND

  • 轻松学Pytorch – 年龄与性别预测

    大家好,上周太忙,没有更新Pytorch轻松学系列文章,但是我还是会坚定的继续走下去的,所谓有始有终,这个系列我会一直坚持写下去,希望大家继续支持我,积极给我反馈,当然也感谢大家的信任与点赞支持。本文主要是基于公开数据集,完成了一个人脸的年龄与性别预测网络模型,以及模型训练与导出使用、本篇主要讲述的知识点有以下:如何实现卷积神经网络的多任务不同输出如何同时实现分类跟回归预测基于人脸年龄与性别的公开数据的数据制作使用多任务网络实现推理预测数据集本文使用的数据集来自这里https://susanqq.github.io/UTKFace/复制我使用的是已经对齐跟剪切之后的人脸数据,超过2W多张的标注数据,标注信息如下:[age]_[gender]_[race]_[date&time].jpg文件名称格式就是每张图像的标注信息Age表示年龄,范围在0~116岁之间Gender表示性别,0表示男性,1表示女性Race表示人种,基于Pytorch的dataset超类,重新完成了我的自定义数据集,代码如下:classAgeGenderDataset(Dataset): def__init__

  • 在线网站 blog-react 项目的文档说明

    主页前言此blog项目是基于react全家桶+AntDesign的,项目已经开源,项目地址在github上。1.效果首页完整效果请看:http://biaochenxuying.cn/main.html2.功能描述2.1已经实现功能√登录√注册√文章列表√标签分类√个人介绍√点赞与评论√留言√时间轴√发文(支持MarkDown语法)√文章详情展示(支持代码语法高亮)2.2待实现功能x文章归档x文章分类x文章详情的目录x移动端适配x升级webpack版本到4.X3.前端技术3.1主要技术react:16.5.2antd:3.9.3react-router::4.3.1webpack:3.8.1axios:0.18.0redux:4.0.0highlight.js:9.12.0marked:0.5.14.项目搭建项目是按antd推荐的教程来搭建的:antd在create-react-app中使用,实现了按需加载组件代码和样式。5.主要项目结构-components -article文章详情 -articles文章列表 -comments评论 -loadEnd加载完成 -loading加载中

  • 学习大数据要掌握哪些语言?需要学习哪些内容?

    大数据是近五年兴起的行业,发展迅速,很多技术经过这些年的迭代也变得比较成熟了,同时新的东西也不断涌现,想要保持自己竞争力的唯一办法就是不断学习。但是,大数据需要学习什么?01思维导图下面的是我之前整理的一张思维导图,内容分成几大块,包括了分布式计算与查询,分布式调度与管理,持久化存储,大数据常用的编程语言等等内容,每个大类下有很多的开源工具。02大数据需要的语言Javajava可以说是大数据最基础的编程语言,据我这些年的经验,我接触的很大一部分的大数据开发都是从JaveWeb开发转岗过来的(当然也不是绝对我甚至见过产品转岗大数据开发的,逆了个天)。一是因为大数据的本质无非就是海量数据的计算,查询与存储,后台开发很容易接触到大数据量存取的应用场景二就是java语言本事了,天然的优势,因为大数据的组件很多都是用java开发的像HDFS,Yarn,Hbase,MR,Zookeeper等等,想要深入学习,填上生产环境中踩到的各种坑,必须得先学会java然后去啃源码。说到啃源码顺便说一句,开始的时候肯定是会很难,需要对组件本身和开发语言都有比较深入的理解,熟能生巧慢慢来,等你过了这个阶段,习惯了

  • Java常用类库(二)

    顶哥说Java是世界的,但项目不是。今天介绍集合类的以下内容:Iterator迭代器子范围视图简介Iterator迭代器:应该将java迭代器认为是位于两个元素之间,当调用next时,迭代器就越过下一个元素,并返回刚刚越过的那个元素的引用。图1:迭代器原理需要注意的是,对于迭代器的next方法和remove方法的调用具有互相依赖性.如果调用remove之前没有调用next将是不合法的,会抛出IllegalStateException异常。图2:状态异常子范围视图简介:可以为很多集合建立子范围(subrange)视图,如有一个列表stuList,想从当中取出第10个-第19个元素.可以使用subList方法来获得一个列表的子范围视图。图3:子范围视图第一个索引包含在内,第二个索引不包含在内,这与String类的substring操作中的参数情况相同,可以将任何操作用于子范围,并且能够自动地反映到整个列表的情况.例如可以删除整个子范围。视图技术在集合框架中有许多非常有用的应用,这里只是介绍了一个非常简单实用的例子。

  • etcd单台部署,启用https以及ca自签名

    原创内容,转载请注明出处 博主地址:https://aronligithub.github.io/前言在经过上一篇章关于etcd相关技术概述的铺垫,这个篇章就是介绍以及演示单台etcd部署以及使用CFSSL来生成CA证书 环境要求1、一台安装centos7的服务器 2、具备访问互联网 3、关闭服务器的防火墙以及selinux CFSSL工具的安装下载CFSSL的可执行二进制文件 wgethttps://pkg.cfssl.org/R1.2/cfssl_linux-amd64 wgethttps://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 wgethttps://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 chmod+xcfssl*复制下载执行过程截图如下 安装wget工具 下载文件的过程 给文件添加执行权限 执行过程截图如下 复制可执行文件至指定目录 使用CFSSL创建CA证书以及etcd的TLS认证证书创建CA(CertificateAuthority) 创建

  • 从matlab的bwmorph函数的&#39;majority&#39;参数中扩展的一种二值图像边缘光滑的实时算法。

      在matlab的图像处理工具箱中,有一系列关于BinaryImages的处理函数,都是以字母bw开头的,其中以bwmorph函数选项最为丰富,一共有'bothat'、'branchpoints'、'bridge'、'clean'、'close'等十几个方法,其中像骨骼化、细化等常见的功能也集成在这个函数里,同常规的写法一样,这些算法都是需要迭代的,因此,这个函数也有个迭代次数的参数。那么另外一些算子,比如clean、diag、remove等等其实都是基于3*3或者5*5领域的,而其中的'erode'、'open'也只是基于3*3的,因此和真正的常用的腐蚀和膨胀还有所不同,那个需要使用imopen或者imclose实现。实际上,这些基于3*3或者5*5的小算子,他们对于二值图基本上就是用一次结果接没有变换,几迭代次数多了也没有啥用。那几个图测试下其中几个算子的效果:                           原图                                          Remov

  • JNDI配置笔记

    先在tomcatContext.xml配置文件中配置 <Resourcename="jdbc/elifecrm" type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.13.11:13306/crm_elife?useUnicode=true&amp;characterEncoding=UTF8&amp;zeroDateTimeBehavior=convertToNull" username="crm_elife" password="elife123" initialSize="10" maxActive="500" minIdle="10" maxIdle="500" maxWait="500" testWhileIdle="true" testOnBorrow="true" testOnReturn="false" validationQuery="SELECT1fromdual" validat

  • 在 npm 中如何用好 registry

    npm库 npmconfigsetregistryhttps://registry.npm.taobao.org复制   使用自定义库 npm--registryhttp://10.10.10.10installexpress复制   可以通过以下配置进行验证 npmconfiggetregistry //或 npminfoexpress复制   也可以使用cnpm npminstall-gcnpm--registry=https://registry.npm.taobao.org复制  

  • 安装python模块

    安装python模块到本地https://www.cnblogs.com/dachang/p/11160224.html

  • 线性排序(如何根据年龄给100万用户数据排序)

    """ 总结:桶排序、计数排序、基数排序 一、线性排序算法介绍 1.线性排序算法包括桶排序、计数排序、基数排序。 2.线性排序算法的时间复杂度为O(n)。 3.此3种排序算法都不涉及元素之间的比较操作,是非基于比较的排序算法。 4.对排序数据的要求很苛刻,重点掌握此3种排序算法的适用场景。 二、桶排序(Bucketsort) 1.算法原理: 1)将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行快速排序。 2)桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。 2.使用条件 1)要排序的数据需要很容易就能划分成m个桶,并且桶与桶之间有着天然的大小顺序。 2)数据在各个桶之间分布是均匀的。 3.适用场景 1)桶排序比较适合用在外部排序中。 2)外部排序就是数据存储在外部磁盘且数据量大,但内存有限无法将整个数据全部加载到内存中。 4.应用案例 1)需求描述: 有10GB的订单数据,需按订单金额(假设金额都是正整数)进行排序 但内存有限,仅几百MB 2)解决思路: 扫描一遍文件,看订单金额所处数据范围,比如1元-10万元,那么就分100个桶。 第一个桶存储金

  • odoo与小红书对接笔记

    由于业务需要,公司内部的ERP系统需要与小红书对接,介于odoo当前的市场覆盖率,appsstore里自然是没有与此相关的现成模块可用了,既然没有现成的轮子可用,那么就只能自己造轮子了。 小红书接口 小红书的接口大部分都可以从小红书大学的开放平台上找到。这里我们主要的目的是将小红书的订单同步到我们本地的ERP系统中。 产品的匹配 小红书有自己的一套SKU编码,要与本地的ERP做映射关系,这样才能保证产品同步的一致性。这里我们使用了包装,跟ERP中的SKU做了一对一的映射。 小红书的物流模式 小红书支持多种物流模式,其中第三方保税模式是无法从系统中读取到订单状态的,只能利用小红书的回调接口将订单变化时推送到我们的系统中。所幸的是,我们目前的业务使用的一种是直邮,一种是小红书的保税仓(即REDSTANDARD模式)。 用户信息 小红书对用户的隐私设置比较严格,只能获取到未发货的订单的用户信息,一旦订单发货,用户信息就变成了脱敏信息。 订单处理 小红书提供了两个与订单相关的接口,一个是批量查询接口,一个是查询某个订单的详细信息。因此我们的同步策略可以设置为先用批量查询接口同步批量订单信息,然

  • 4月份主要学习

    fromcollectionsimportnamedtuple,OrderedDict,defaultdict fromtorchimportnn fromrecsys_dl.layers.sequenceimportSequencePoolingLayer importtorch classSparseFeat(namedtuple('SparseFeat',['name','vocabulary_size','embedding_dim','use_hash', 'dtype','embedding_name','group_name'])): slots=() #不实用hash处理 defnew(cls,name,vocabulary_size,embedding_dim=4,use_hash=False,dtype='int32', embedding_name=None,group_name="default_group"): ifembedding_nameisNone: embedding_name=name ifembedding_dim=="auto": embedd

  • 统计各省二级地市的数量

    问题:统计各省二级地市的数量 函数解决: 省级名:=INDEX(FILTER(A:A,B:B="省级"),ROW(A1)) 二级地市数量:=COUNTIFS(B:B,"二级地市",D:D,XLOOKUP(F2,A:A,D:D)) 二级地市数量(不加辅助列):=SUM((B:B="二级地市")*(LEFT(C:C,2)=LEFT(VLOOKUP(F2,A:C,3,),2))) 复制   思路: D列添加辅助列,取C列前两位。 Countifs的第三个参数用辅助列,第四个参数利用Xlookup查找每个省级名对应的辅助列。 原博客各种作……所以换阵地了,不过每篇都搬过来,实在有点累,想看就自己看吧:http://blog.sina.com.cn/pureiceshadow

  • png8 png24 png32

    解释 PNG8:8位的PNG最多支持256(2的8次方)种颜色,8位的PNG支持不透明、索引透明、alpha透明。 PNG24:支持2的24次方种颜色,表现为不透明。PS导出PNG24是会根据你是否需要半透明选择PNG24还是PNG32,所以你导出的有半透明的PNG24实际上是有alpha通道的PNG32 PNG32:它是在PNG在24位的PNG基础上增加了8位的透明信息,支持不同程度的半透效果 PNG8和PNG24后面的数字则是代表这种PNG格式最多可以索引和存储的颜色值。”8″代表2的8次方也就是256色,而24则代表2的24次方大概有1600多万色。 共同点 他们都是索引颜色编码方法,可以通过限制图片中的颜色总数的方法实现有损压缩。 有损压缩是利用了人类对图像或声波中的某些频率成分不敏感的特性,允许压缩过程中损失一定的信息;虽然不能完全恢复原始数据,但是所损失的部分对理解原始图像的影响缩小,却换来了大得多的压缩比。 索引颜色 挑选一副图片中最有代表性的若干种颜色(通常不超过256种),编制成颜色表。在表示图片中每一个点的颜色信息时,不直接使用这个点的颜色信息,而使用颜色表的索

  • linux vim 设置,编码

    鸟哥说中文乱码主要跟: 1.你的Linux系统默认支持的语系数据:这与/etc/locale.conf有关;2.你的终端接口(bash)的语系:这与LANG,LC_ALL这几个变量有关;3.你的文件原本的编码;4.打开终端机的软件,例如在SecureCRT 下面的窗口接口。事实上最重要的是上头的第三与第四点,只要这两点的编码一致,你就能够正确的看到与编辑你的中文文件  我用的SecureCRT,选项--全局选项--编辑默认设置--外观里面可以设置终端的字符集,切记要用快速连接 连接虚拟机才会使用默认的设置,如果直接连接的貌似还是乱码 而且没有找到再哪里更改,如果谁知道怎么处理的话可以跟我说一下。   首先vim编码乱码 可以先尝试下载vim新版本 http://www.vim.org/download.php打开来有点慢 在编译之前,先要./configure--help查看一下配置选项, 其中这个配置需要加进来:--enable-multibyte     Includem

  • Kafka2.12-2.5.0在windows环境的安装 启动 通信测试

    1. Kafka下载,我使用的版本是2.12-2.5.0 http://kafka.apache.org/downloads 2.安装 (1)解压到:D:\kafka\kafka_2.12-2.5.0 (2)新建目录:D:\kafka\kafka_2.12-2.5.0\logs 用来存放Kafka启动相关的日志    (3)修改配置文件:D:\kafka\kafka_2.12-2.5.0\config\server.properties     log.dirs=D:\kafka\kafka_2.12-2.5.0\logs (4)启动   ① 新建cmd窗口启动zookeeper,在目录:D:\kafka\kafka_2.12-2.5.0\bin\windows   下执行: zookeeper-server-start.bat..\..\config\zookeeper.properties   ②&nbs

  • JS中的原型对象与构造器

    在Javascript中:原型对象是属于构造函数的,不属于实例;实例只能共享原型对象中的属性和方法(当然也可以有自己的属性和方法,或者覆盖原型中同名的属性和方法);构造器constructor属于原型的,不属于实例;实例之所以能有constructor属性是因为它共享了原型对象的所有成员,包括原型对象的constructor属性;functionWede(){this.name="zhao"}//输出构造函数的原型对象console.log(Wede.prototype);//Wede{}//给构造函数的原型对象增加成员属性Wede.prototype.Sex="man";//"man"//new一个实例varzw=newWede();//输出构造函数的原型对象的constructor属性Wede.prototype.constructor;//functionWede(){this.name="zhao"}//然而,当我们查看构造函数的constructor属性时,它输出的是Function构造器Wede.constructor;//functionFunction(){[nativ

  • 图解Java设计模式之外观模式

    图解Java设计模式之外观模式 影院管理项目 传统方式解决影院管理 传统方式解决影院管理问题分析 外观模式基本介绍 外观模式原理类图 外观模式解决影院管理 外观模式的注意事项和细节   影院管理项目 组建一个家庭影院:DVD播放器、投影仪、自动屏幕、环绕立体声、爆米花机,要求完成使用家庭影院的功能,其过程为:直接用遥控器:统筹各设备开关开爆米花机放下屏幕开投影仪开音响开DVD,选dvd去拿爆米花调暗灯光播放观影结束后,关闭各种设备 传统方式解决影院管理 传统方式解决影院管理问题分析 1)在ClientTest的main方法中,创建各个子系统的对象,并直接去调用子系统(对象)相关方法,会造成调用过程混乱,没有清晰的过程。2)不利于在ClientTest中,去维护对子系统的操作。3)解决思路:定义一个高层接口,给子系统中的一组接口提供一个一致的界面(比如在高层接口提供四个方法ready,play,pause,end),用来访问子系统中的一群接口4)也就是说,通过定义一个一致的接口(界面类),用以屏蔽内部子系统的细节,使得调用端只需跟这个

  • [坐标]关于坐标系和投影的相关知识探讨[转]

       回想一下,接触遥感专业也有几个年头了,而现在越来越偏离遥感了,突然想着把自己脑中的遥感知识整理出来。首先想到的便是坐标系和投影,我想这个东西困扰着80%以上的测绘、遥感和GIS领域的从业人员吧,群里经常有人问,我自己曾经也很迷糊,什么大地坐标系啊、地心坐标系啊、高斯投影啊、UTM投影啊,搞得头都大了,可是这玩意又不能不玩,毕竟空间信息是遥感数据的灵魂,如果定位不准影像就只能当风景画看了。好吧,那就啃吧,基础的东西还是要的,经过一番探索,再加上去年专门做过坐标转换一些工作,算是清晰明了些了,在此就把我的一些见解分享给大家,欢迎各位菜鸟和专家前来吐槽。好了,咱们言归正传,开始坐标系探险记。 1、什么是坐标系?     或许很多人心中明白这个概念,却又不甚明白。什么是坐标系?人们描述空间中的一个点或者一个位置,通常会采用坐标这个概念。可是这个坐标该怎么计算呢?它的参考是谁呢?如果中国定义中南海坐标是(1921,1949,2012),美国佬也定义他们白宫的坐标是(1921,1949,2012),哪天黑马说咱们打它中南海

  • 饿汉模式和懒汉模式

      第一个懒汉模式  

相关推荐

推荐阅读