篱笆外小雨


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

Missing parentheses in call to 'print'—— Python错误及修改

发表于 2017-12-30 | 分类于 Python | 阅读次数

运行时出现错误提示如下:

Missing parentheses in call to ‘print’

出现这个提示是因为所使用的Python语法有错。你正在试图用python3.x来运行python2.x的python脚本。

软件测试基础知识

发表于 2017-12-27 | 分类于 系统开发与运行 , 软件测试 | 阅读次数

测试过程

  • 制定测试计划。内容主要有测试内容、进度安排、测试所需环境和条件、测试培训安排等
  • 编制测试大纲。明确、详尽地规定测试中针对系统的每一项功能或特征所必须完成的基本测试项目和测试完成标准。
  • 设计并生成测试用例,产生测试设计说明文档。主要有被测试项目、输入数据、测试过程和预期输出结果等
  • 实施测试。
  • 生成测试报告。对测试进行概要说明,列出测试结论,指出缺陷和错误,给出建议。

测试策略

有效的软件测试分为4步:单元(模块)测试、集成测试、确认(验收)测试和系统测试

单元测试(白盒测试)

在模块编写完成且无编译错误后进行。侧重于对模块中的内部处理逻辑与数据结构。

单元测试内容
1 模块接口。测试模块的输入参数和形式参数在个数、属性、单位上是否一致;调用其他模块时,所给出的实际参数和被调用模块的形式参数在个数、属性、单位上是否一致;调用标准函数时,所使用的参数在属性、数目和顺序上是否正确;全局变量在各模块中的定义和用法是否一致;输入是否仅改变了形式参数;开/关的语句是否正确;规定的IO格式是否与输入/输出语句一致;在使用文件之前是否已经打开文件或使用文件之后是否已经关闭文件。
2 局部数据结构。变量的说明是否合适;是否使用了尚未赋值或尚未初始化的变量;变量的初始值或默认值是否正确;变量名是否有错。
3 重要的执行路径。发现是否有计算、比较或控制流方面错误。
4 出错处理。好的设计应该能够预测到出错条件并且有对出错处理的路径。
5 边界条件。

集成测试

集成测试有两种方法:一种非增量集成,另一种增量集成

  • 增量集成策略
    1 自顶向下集成测试。自顶向下集成测试时一种构造软件体系结构的增量方法。模块集成顺序为从主控模块(主程序)开始,沿着控制层逐步向下,以深度优先或广度优先的方式将从属主控模块的模块集成到结构中。
    2 自底向上集成测试。自底向上集成测试就是从原子模块(程序结构最底层构件)开始进行构造和测试。
    3 回归测试。重新执行已测试过的某些子集,以确保变更没有传播不期望的副作用。
    4 冒烟测试。在测试中发现问题,找到了一个Bug,然后开发人员会来修复这个Bug。这时想知道这次修复是否真的解决了程序的Bug,或者是否会对其它模块造成影响,就需要针对此问题进行专门测试,这个过程就被称为Smoke Test。
确认测试

测试集中于用户可见动作和用户可识别的系统输出

  • α测试与β测试。α测试是由有代表性的最终用户在开发者的场所进行。开发者在用户后面观看,并记录错误和使用问题。β测试 在一个或多个最终用户场所执行。最终用户记录测试过程中遇到的所有问题(现实存在或想象的),并定期报告给开发者。接到问题测试报告后开发人员对软件进行修改,然后准备向用户发布软件产品。
系统测试

系统测试是将已确认的软件、计算机硬件、外设和网络等因素结合在一起,进行信息系统的各种集成测试和确认测试,目的在于通过与系统的需求分析比较,发现所开发的系统与用户需求不符或矛盾的地方。
1 恢复测试。通过各种方式强制地让系统发生故障,并验证能否安装要求从故障中恢复过来,并在规定的时间内开始进行事物处理,而且不对系统造成任何伤害。
2 安全性测试。验证建立在系统内的保护机制是否能够实际保护系统不受非法入侵。测试过程中,测试人员模拟非法入侵者,采用各种方法冲破防线。
3 压力测试。压力测试要求以非正常的数量、频率或容量等方式执行系统。
4 性能测试。测试软件在集成环境中的运行性能。
5 部署测试。在多种运行环境中测试软件。

测试方法

软件测试方法分为静态测试和动态测试。静态测试是指被测试程序不在机器上运行,而是采用人工检测和计算机辅助静态分析的手段对程序进行检测。动态测试是指运行程序发现错误,可采用黑盒测试和白盒测试。

黑盒测试

黑盒测试也称功能测试,在完全不考虑软件的内部结构和特征的情况下,测试软件的外部特性。
常用的黑盒测试技术有等价类划分、边界值分析、错误推测和因果图的等。
1 等价类划分。将程序的输入域划分为若干等价类,然后从每个等价类中选取一个代表性数据作为测试用例。
2 边界值分析。输入的边界比中间值更加容易发生错误。
3 错误推测。基于经验和直觉推测程序中所有可能存在的各种错误,从而有针对性的设计测试用例。即列举程序中所有可能的有的错误和容易发生的错误的特殊情况,根据他们选择测试用例。
4 因果图。从自然语言描述的程序规格说明中找到因(输入条件)和果(输出或程序状态的改变),通过因果图转换为判定表。

白盒测试

白盒测试也称结构测试,根据程序的内部结构和逻辑来设计测试用例,对程序的路径和过程进行测试,检查是否满足设计的要求。
白盒测试常用的测试技术是逻辑覆盖、循环覆盖和基本路径测试。
1 逻辑覆盖。逻辑覆盖考察测试数据运行被测试程序时的覆盖程度,主要的逻辑覆盖标准有语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖6种。

  • 语句覆盖。语句覆盖指选择足够的测试数据,使被测试过程中的每条语句至少执行一次。
  • 判定覆盖。判定覆盖指设计足够的测试用例,使得被测试程序中的每个判定表达式至少获得一次“真”值和“假”值。
  • 条件覆盖。条件覆盖指构造一组测试用例,是的每一判定语句中的每个逻辑条件的各种可能的值至少满足一次。
  • 判定/条件覆盖。判定/条件覆盖指设计足够的测试用例,使得判定中的每个条件的所有可能值(真/假)至少出现一次,并使每个判定本身的判定结果(真/假)也至少出现一次。
  • 条件组合覆盖。条件组合覆盖指设计足够多的测试用例,使得每个判定条件的各种可能值的组合都至少出现一次。
  • 路径覆盖。路径覆盖指覆盖被测试程序中所有可能的路径。-
    2 循环覆盖。执行足够的测试用例,使得循环中的每个条件都得到验证。
    3 基本路径覆盖。在程序控制流图的基础上通过分析控制流图的环路复杂性,导出基本可执行路径集合,从而设计测试用例。

数据结构——排序

发表于 2017-12-15 | 分类于 数据结构 , 排序 | 阅读次数

个人理解,仅供参考 ─=≡Σ(((つ??ω??)つ

排序就是将无序的记录变为有序的记录。

判断排序方法是否的稳定:当记录中存在相同的关键字时,关键字在排序前后相对位置关系不变

插入排序

直接插入排序:从第二个关键字开始,依次与其前面的所有关键字比较 希尔排序:排序表中含有n个记录,取当前表长的1/2为增量d,将其分为d个子表,子表关键字数为d+1。对子表进行直接插入排序。一趟排序结束后缩小增量,重复上述操作,直到增量为1。

交换排序

冒泡排序:两相邻的关键字相比较。n个记录,第0个记录与第1个记录比较,比较完后的第1个记录再与第2个记录比较,直到所有记录比较完,一趟比较结束,此后每趟比较的最后一位记录不再参与下次比较。开始下一趟比较,直到结束。 快速排序:一趟排序将记录分为两部分,在对两部分分别进行快速排序。 一趟快速排序,i,j为排序记录的起始下标和终止下标,第i+1个记录为temp,从下标j开始,由后向前,找到一个比temp小的记录,将记录放到下标i位置,i++。接着由下标i开始,由前向后,找到一个比temp大的记录,将记录放到下标j位置,j–。重复搜索步骤,直到i==j。第i+1个记录为temp。

选择排序

** 直接选择排序:每趟都是找出最小的记录与开始记录交换位置,每趟结束的开始位置的记录不再参与下一趟。

排序算法性能比较(稳定性与时间空间复杂度)

排序算法 平均时间复杂度 最好时间复杂度 最坏时间复杂度 空间复杂度 稳定性
直接插入排序 O(n^2) O(n) O(n^2) O(1) 稳定
:——: :——-: :——-: :——-: :——-: :——-:
希尔排序 / / / O(1) 不稳定
:——: :——-: :——-: :——-: :——-: :——-:
冒泡排序 O(n^2) O(n^2) O(n^2) O(1) 稳定
:——: :——-: :——-: :——-: :——-: :——-:
快速排序 O(nlogn) O(nlogn) O(n^2) O(logn) 不稳定
:——: :——-: :——-: :——-: :——-: :——-:
直接选择排序 O(n^2) O(n^2) O(n^2) O(1) 不稳定
:——: :——-: :——-: :——-: :——-: :——-:
堆排序 O(nlogn) O(nlogn) O(nlogn) O(1) 不稳定
:——: :——-: :——-: :——-: :——-: :——-:
归并排序 O(nlogn) O(nlogn) O(nlogn) O(n) 稳定
:——: :——-: :——-: :——-: :——-: :——-:

Android 数据存储——SharedPreferences 存储

发表于 2017-12-14 | 分类于 Android | 阅读次数

SharedPreferences 是使用键值对的方式存储数据,是Android平台上用于存储如配置信息等轻量级存储数据的接口。为每一条数据提供一个对应的键,在读取数据时通过键把相应的值取出来。支持多种数据类型存储,存储方便简单

代码

Activity
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
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class DataStorage_sp_Activity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.datastorage_sp_activity);
}

public void onClick(View view){
EditText editText =(EditText) findViewById(R.id.editText);
String text = editText.getText().toString();
/* SharedPreferences存储
* 1.调用SharedPreferences对象的edit()方法,获取SharedPreferences.Editor对象
* 2.向SharedPreferences.Editor对象中添加数据,put方法(包括基本数据类型与String)
* 3.调用apply()或commit()方法将添加数据提交到“test”中
* */
SharedPreferences.Editor editor = getSharedPreferences("test",MODE_PRIVATE).edit();
editor.putString("name",text);
// editor.apply();
editor.commit();

/* SharedPreferences读取
* 1.定义SharedPreferences对象
* 2.从SharedPreferences对象中读取数据,get方法
* */
SharedPreferences sp = getSharedPreferences("test",MODE_PRIVATE);
String name = sp.getString("name","");
TextView textView =(TextView) findViewById(R.id.textView);
textView.setText(name);
}
}
layout
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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Name"
android:inputType="textPersonName" />

<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="确定" />
</LinearLayout>

微信小程序——配置文件介绍

发表于 2017-11-21 | 分类于 微信小程序 | 阅读次数

微信小程序中的文件类型有

1 .json 后缀的 JSON 配置文件
2 .wxml 后缀的 WXML 模板文件
3 .wxss 后缀的 WXSS 样式文件
4 .js 后缀的 JS 脚本逻辑文件

JSON配置文件

** app.json 是对当前小程序的全局配置,包括所有页面路径、界面表现、网络超时时间、底部tab等

注: .json不支持注释
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
41
42
43
44
45
46
47
48
49
50
51
52

/*
* 小程序所有页面路径
*/
"pages":[
"pages/index/index",
"pages/logs/logs"
],
/*
*界面表现
*/
"window":{
"backgroundTextStyle":"light", //下拉背景字体、loading图的样式,仅支持dark、light
"navigationBarBackgroundColor": "#fff",//导航栏背景颜色
"navigationBarTitleText": "WeChat",//导航栏标题文字内容
"navigationBarTextStyle":"black", //导航栏标题颜色,仅支持black/white
"backgroundColor":"#fff",//窗口的背景颜色
"enablePullDownRefresh":false//是否开启下拉刷新
},
/*
* tab
*/
"tabBar": {
"color":"#fff",//tab上文字默认颜色
"selectedColor":"#fff",//tab上文字选中时颜色
"backgroundColor":"#fff",//tab背景颜色
"borderStyle":"black",//tabbar上边框的颜色,仅支持black/white
//tab的列表,最少2个,最多5个tab
"list": [{
"pagePath": "pages/index/index",//页面路径,必须现在pages中定义
"text": "首页",//tab上的按钮文字
"iconPath":"images/1.jpg",//图片路径,icon 大小限制为40kb,建议尺寸为 81px * 81px,当 postion 为 top 时,此参数无效
"selectedIconPath":"images/2.jpg"//选中时的图片路径,icon 大小限制为40kb,建议尺寸为 81px * 81px ,当 postion 为 top 时,此参数无效
}, {
"pagePath": "pages/logs/logs",
"text": "日志"
}],
"position":"bottom"//可选值bottom/top
},
/*
* 网络请求超时时间
*/
"networkTimeout": {
"request": 10000,// wx.request的超时时间,单位毫秒
"connectSocket":10000,//wx.connectSocket的超时时间,单位毫秒
"uploadFile":10000,//wx.uploadFile的超时时间,单位毫秒
"downloadFile": 10000//wx.downloadFile的超时时间,单位毫秒
},
/*
*在开发者工具中开启 debug 模式,在开发者工具的控制台面板,调试信息以 info 的形式给出,其信息有Page的注册,页面路由,数据更新,事件触发 。可以帮助开发者快速定位一些常见的问题
*/
"debug": true

** page.json页面配置。页面配置只需要配置Window配置项的内容,页面中的配置项会覆盖app.json中window中相同的配置项。

1
2
3
4
5
6
7
8
{
"navigationBarBackgroundColor": "#ffffff",
"navigationBarTextStyle": "black",
"navigationBarTitleText": "微信接口功能演示",
"backgroundColor": "#eeeeee",
"backgroundTextStyle": "light",
"disableScroll":true//设置为 true 则页面整体不能上下滚动;只在 page.json 中有效,无法在 app.json 中设置该项
}

WXML配置文件

.wxml描述当前页面的结构

WXSS配置文件

.wxss描述 WXML 的组件样式
与 CSS 相比,WXSS 扩展的特性有:


  • 尺寸单位

  • 样式导入


尺寸单位

  • rpx(responsive pixel): 可以根据屏幕宽度进行自适应。规定屏幕宽为750rpx。
  • 样式导入

  • 使用@import语句可以导入外联样式表,@import后跟需要导入的外联样式表的相对路径,用;表示语句结束。
  • 选择器









    选择器样例样例描述
    .class.intro选择所有拥有 class=”intro” 的组件
    #id#firstname选择拥有 id=”firstname” 的组件
    elementview选择所有 view 组件
    element, elementview, checkbox选择所有文档的 view 组件和所有的 checkbox 组件
    ::afterview::after在 view 组件后边插入内容
    ::beforeview::before在 view 组件前边插入内容

    JS脚本逻辑文件

    .js交互逻辑,响应用户的操作

    Android开发——获取网络权限

    发表于 2017-10-10 | 分类于 Android | 阅读次数

    在Android开发中获取网络权限

    在 manifests文件夹中的 AndroidManifest.xml 中添加语句

    1
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>

    Android——监听Button(按钮)单击事件

    发表于 2017-09-27 | 分类于 Android | 阅读次数

    在Android开发中实现button(按钮)点击事件的方法有几种,这里介绍其中三种:

    方法一:当前类实现OnClickListener接口并在其必须实现的onClick方法中添加事件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;
    public class ButtonActivity extends AppCompatActivity implements OnClickListener {

    TextView text;
    @Override

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_button);
    text = (TextView)findViewById(R.id.btn_out);
    Button btn = (Button)findViewById(R.id.btn);
    btn.setOnClickListener(this);
    }

    public void onClick(View view){
    text.setText("OnClickListener接口");
    }
    }
    方法二:匿名内部类
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;

    public class ButtonActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_button);
    Button btn = (Button)findViewById(R.id.btn);
    final TextView text = (TextView)findViewById(R.id.btn_out);
    btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    text.setText("匿名内部类");
    }
    });
    }
    }
    方法三:自定义方法绑定按钮

    在.xml文件(布局文件)中给Button加上属性android:onClick="MyClick"

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.TextView;

    public class ButtonActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_button);
    }

    void MyClick(View btn){
    ((TextView)findViewById(R.id.btn_out)).setText("自定义监听方法");
    }
    }
    推荐使用方法三
    多个按钮使用同一个监听方法时,可使用按钮的 id 来区分。判断可用 if()...else if()... 或者 switch()。

    Java 网络编程——URL

    发表于 2017-09-19 | 分类于 Java | 阅读次数

    URL类是java.net包中的一个重要的类。一个URL对象封装着一个具体的资源引用。URL对象通常包含最基本的三部分信息:协议、地址和资源。

    URL的构造方法

    方法一:public URL(String str) throws MalformedURLException. 该构造方法使用字符串初始化一个URL对象。
    1
    2
    3
    4
    5
    try{
    URL url = new URL("http://www.baidu.com");
    }catch(MalformedURLException e){
    System.out.println(e);
    }
    方法二:public URL(String protocol, String host, String file) throws MalformedURLException。该构造方法使用的协议、地址和资源分别由protocol、host和file指定。
    1
    2
    3
    4
    5
    try{
    URL url = new URL(protocol,host,file);
    }catch(MalformedURLException e){
    System.out.println(e);
    }

    读取URL中的资源

    URL 对象调用InputStream openStream()方法可以返回一个输入流,该输入流指向URL对象所包含的资源。

    程序代码

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URL;
    import java.util.Scanner;

    public class ReadUrl {

    private static Scanner in;

    public static void main(String[] args) {
    in = new Scanner(System.in);
    Thread readurl;
    URL url;
    Look look = new Look();
    System.out.println("请输入URL,例如:http://www.baidu.com:");
    String string = in.nextLine();
    // System.out.println("请输入URL协议:");
    // String protocol = in.next();
    // System.out.println("请输入URL地址:");
    // String host = in.next();
    try{

    url = new URL(string);
    // url = new URL(protocol,host,"");
    look.setURL(url);
    readurl = new Thread(look);
    readurl.start();
    }catch(Exception e){
    System.out.println(e);
    }
    }

    }

    class Look implements Runnable{

    URL url;
    public void setURL(URL url) {
    this.url=url;
    }
    @Override
    public void run() {
    // TODO Auto-generated method stub
    try{
    InputStream inputStream = url.openStream();
    byte [] bs = new byte[1024];
    int n = -1;
    while((n=inputStream.read(bs))!=-1){
    String string = new String(bs, 0, n);
    System.out.println(string);
    }
    }catch(IOException e){}
    }

    }

    Java 从控制台读取以空格为分隔符的整数,计算其平方并开方

    发表于 2017-09-12 | 分类于 Java | 阅读次数

    有段时间没看书了,连基本的控制台读取都不太记得了(〒︿〒) 为了方便以后查阅还是记下来好了(・ω・)/(ノД`゚)゚

    思路:从控制台读取以空格为分隔符的数据,首先将所有输入看作一个字符串,利用String类提供的分解方法public String[] split(String regex),方法参数为分隔符(正则表达式),分解的结果存放到数组中。

    1
    String strign[] = str.split(regex);

    整数的平方实现可用 Math.pow(n,2)方法或 n*n。

    1
    Math.pow(n,m);	//表示n的m次方

    整数平方根可用 Math.sqrt()方法。

    1
    Math.sqrt(n);	//表示n的平方根

    例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    import java.util.Scanner;

    public class test1{

    public static void main(String[] arg){

    Scanner in = new Scanner(System.in);

    System.out.print("请输入:");

    String string = in.nextLine();
    String string2[] = string.split("\\s"); //单个空格为分隔符
    // String string2[] = string.split(" "); //单个空格为分隔符
    // String string2[] = string.split("[\\s]+"); //单个或多个空格为分隔符

    for(int i =0;i<string2.length;i++){
    System.out.println("整数:"+Integer.parseInt(string2[i]));
    System.out.println("平方:"+Math.pow(Integer.parseInt(string2[i]), 2));
    System.out.println("平方根:"+Math.sqrt(Integer.parseInt(string2[i])));

    }
    }
    }

    测试结果

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    请输入:5 7 9 8
    整数:5
    平方:25.0
    平方根:2.23606797749979
    整数:7
    平方:49.0
    平方根:2.6457513110645907
    整数:9
    平方:81.0
    平方根:3.0
    整数:8
    平方:64.0
    平方根:2.8284271247461903

    归并排序——Java语言描述

    发表于 2017-09-07 | 分类于 排序算法 | 阅读次数

    归并排序 所谓“归并”,是将两个或两个以上的有序文件合并成一个新的有序文件。其中将两个有序表合并成一个有序表的归并排序称为2-路归并。

    程序代码

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    import java.util.Arrays;

    public class MergingSort {

    /**
    * 2-路归并排序:将长度为n的待排序记录看作是一个含有n个长度为1的有序子表,把这些子表以次两两归并,
    * 得到[n/2]个有序的子表;然后再把这[n/2]个有序子表进行两两归并,如此重复,
    * 直到最后得到一个长度为n的有序子表为止。
    * 空间复杂度为O(n)
    * 时间复杂度为O(nlogn)
    * 算法稳定性:2-路归并排序是一种稳定的排序算法
    * */

    /* 两个有序列表的归并算法 */
    public static void Merge(int merge[],int temp[],int m,int n,int k) {
    int i,j;
    int len = n-m+1;
    for(i=k+1,j=m; m<=k && i<=n; j++){ //将merg中的记录由小到大并入temp
    if(merge[m]<merge[i]){
    temp[j]=merge[m++];
    }
    else {
    temp[j] = merge[i++];
    }
    }
    for(; m<=k; j++){ ////将剩余的merge[n...m]复制到temp
    temp[j] = merge[m++];
    }
    for(; i<=n; j++){ //将剩余的merge[i...n]复制到temp
    temp[j] = merge[i++];
    }

    for(i=0; i<len; i++){ //将temp复制到merge
    merge[n] = temp[n];
    n--;
    }
    }

    /* 2-路归并排序算法 */
    public static void MergeSort(int merge[],int temp[],int m, int n) {
    if(m<n){
    int k = (m+n)/2;
    MergeSort(merge, temp, m, k); //左边
    MergeSort(merge, temp, k+1, n); //右边
    Merge(merge, temp, m, n ,k); //归并两个有序列表
    }

    }

    public static void MergeSort(int merge[]) {
    MergeSort(merge,new int[merge.length],0,merge.length-1);
    }

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    int merge[] = {52,39,67,95,70,8,25,52,56,16};
    MergeSort(merge);
    System.out.println("归并后序列:"+Arrays.toString(merge));
    }
    }

    测试结果

    1
    归并后序列:[8, 16, 25, 39, 52, 52, 56, 67, 70, 95]
    123…5
    篱笆外小雨

    篱笆外小雨

    刚刚好^_^

    41 日志
    22 分类
    26 标签
    RSS
    © 2018 篱笆外小雨
    由 Hexo 强力驱动
    主题 - NexT.Mist