Java编程练习Day10--》数组排序与查询02

Java编程练习Day10–》数组排序与查询02

使用直接插入法


实例说明

本实例演示如何使用直接插入排序法对一维数组进行排序。运行本实例,首先单击“随机生成数组”按钮,生成一个随即数组,并显示在左边的文本框中;然后单击插入排序法按钮,使用直接插入法对生成的一维数组进行排序,并将排序后的一维数组显示在右边的文本框中。

直接插入排序算法
插入排序是将一个记录插入到有序数列中,是得到的新数列仍然有序。插入排序算法的思想是:
将n个有序数存放在数组a中,要插入的数为x,首先确定x插在数组中的位置p,数组中p之后的元素都向后移一个位置,空出a§,将x放入a§。这样即可实现插入后数列仍然有序。

设计过程

1.在项目中新建窗体类InsertSort。在窗体中添加两个文本域控件和随机生成数组,插入排序法两个按钮。
2.编写随机生成数组按钮的事件处理方法,在该方法中利用Random类的实例对象的nextInt()方法生成随机数,并为数组设置初始值。
3.编写插入排序法按钮的事件处理方法,在该方法中使用插入排序算法对数组进行排序,并把排序后的数组显示到界面中。

测试代码


import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

/**
 *
 * @author nanqi-code
 * @create 2021/8/20-18:00
 */
public class InsertSort extends JFrame {

    //创建文本域
    JTextArea textArea1;
    JTextArea textArea2;
    //创建按钮
    JButton sort;
    JButton numRandom;

    private int[] array = new int[10];

    public InsertSort(){
        textArea1 = new JTextArea(10,15);
        textArea2 = new JTextArea(10,15);
        sort = new JButton("插入排序法");
        numRandom = new JButton("生成随机数");
        //设置窗体标题
        setTitle("直接插入法");
        //设置窗体的位置和大小
        setBounds(250, 250, 510, 515);
        //设置窗体的关闭方式
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        //设置窗体可见
        setVisible(true);
        //设置窗体不可缩放
        setResizable(false);
        //设置布局方式为空布局
        setLayout(null);

        //设置各组件在窗口中的位置和大小
        textArea1.setBounds(20, 20, 100, 400);
        numRandom.setBounds(175, 125, 120, 40);
        textArea2.setBounds(380, 20, 100, 400);
        sort.setBounds(175, 375, 120, 40);

        //为按钮添加事件监听器
        sort.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int temp;//定义临时变量
                int j;
                for (int i = 1; i < array.length; i++) {
                    temp = array[i];//保存临时变量
                    for (j = i - 1; j >= 0 && array[j] > temp; j--) {
                        array[j+1] = array[j];//数组元素交换
                    }
                    array[j+1] = temp; //在排序位置插入数据
                }
                textArea2.setText("");
                for (int i = 0; i < array.length; i++) {//初始化数组元素
                    textArea2.append(array[i] + "\n");//把数组元素添加到文本域控件中
                }
            }

        });

        numRandom.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                Random random = new Random();//创建随即数组对象
                textArea1.setText("");//清空文本域
                //初始化数组元素
                for(int i = 0; i < array.length; i++){
                    array[i] = random.nextInt(50);//生成50以内的随机数
                    textArea1.append(array[i]+"\n");//把数组元素显示到文本域控件中
                }
            }
        });

        //将各组件添加到窗口中去
        add(textArea1);
        add(textArea2);
        add(sort);
        add(numRandom);
    }

    public static void main(String[] args) {
        new InsertSort();
    }
}

运行结果

在这里插入图片描述

使用sort()方法对数组进行排序


实例说明

实际开发项目中,经常需要对程序中用到的数组进行排序,而且在各种编程语言中,也提供了很多种对数组进行排序的算法。如冒泡排序,直接插入法和选择排序法等,但在使用排序算法时,开发人员必须手动编写一堆代码,而且有的实现起来比较麻烦。Java中的Arrays类提供了一个sort()方法,使用这个方法,开发人员可以很方便的对各种数组进行排序,大大的降低了数组排序的难度。本实例将使用该方法对数组进行快速排序。

Arrays位于java.util包中,它是数组的一个工具类,包含很多方法,其中sort()方法就是Arrays类提供的对数组进行排序的方法,它有很多重载格式,可以接受任何数据类型的数组并执行不同类型的排序。
本实例使用sort()方法的int参数类型的重载实现。其方法声明如下:

public static void sort(int[] array)
参数说明
array:要排序的int类型的一维数组

设计过程

1.在项目中创建窗体类SortArray。在窗体中添加一个文本框,一个文本域和一个排序按钮。
2.为排序按钮编写事件处理方法,在该方法中要接受用户输入的字符串,并以字符串的空格字符分割字符串为数组,再把字符串数组转换为整型数组,然后调用Arrays类的sort()方法对其进行排序,最后显示到窗体中。
3.编写文本框的按键事件处理方法,通过该方法的编写来限制文本框可输入的字符,当用户按下非数字与空格字符时,取消本次输入的有效性。

测试代码

package com.zhang.exer.day10;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Arrays;
import java.util.Random;

/**
 * @author nanqi-code
 * @create 2021/8/20-18:58
 */
public class SortArray extends JFrame{
    //创建文本域
    JTextArea textArea1;
    JTextArea textArea2;
    //创建按钮
    JButton sort;
    //创建标签
    JLabel tip;

    public SortArray() {
        textArea1 = new JTextArea(25,100);
        textArea2 = new JTextArea(50,100);
        sort = new JButton("排序");
        tip = new JLabel("输入数组内容,空格为数组元素分割符");
        //设置窗体标题
        setTitle("使用sort()方法对数组进行排序算");
        //设置窗体的位置和大小
        setBounds(250, 250, 457, 355);
        //设置窗体的关闭方式
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        //设置窗体可见
        setVisible(true);
        //设置窗体不可缩放
        setResizable(false);
        //设置布局方式为空布局
        setLayout(null);

        //设置各组件在窗口中的位置和大小
        tip.setBounds(20, 8, 300, 45);
        textArea1.setBounds(20, 50, 400, 20);
        textArea2.setBounds(20, 125, 400, 180);
        sort.setBounds(162, 83, 80, 25);

        //为按钮添加事件监听器
        sort.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String text = textArea1.getText();//获取用户输入
                String[] arrayStr = text.split(" {1,}");//拆分输入为数组
                int[] array = new int[arrayStr.length];//创见整数类型数组
                textArea2.setText("数组原有内容:\n");
                for (String str:arrayStr//输出原有数组内容
                     ) {
                    textArea2.append(str + "  ");
                }
                for (int i = 0; i < array.length; i++) {//初始化整型数组
                    array[i] = Integer.parseInt(arrayStr[i]);
                }
                textArea2.append("\n");
                Arrays.sort(array);//使用sort()方法对整型数组进行排序
                textArea2.append("数组排序后的内容:\n");
                for (int value : array//输出排序后的数组内容
                     ) {
                    textArea2.append(value + "  ");
                }
            }
        });
        textArea1.addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent e) {
                char key = e.getKeyChar();//获取用户按键字符
                String mask = "0123456789" + (char)32;//定义规范化字符模板
                if(mask.indexOf(key)  == -1){//判断按键字符是否属于规范化字符范围
                    e.consume();//取消非规范化字符的输入有效性
                }
            }

            @Override
            public void keyPressed(KeyEvent e) {

            }

            @Override
            public void keyReleased(KeyEvent e) {

            }
        });


        //将各组件添加到窗口中去
        add(textArea1);
        add(textArea2);
        add(sort);
        add(tip);

    }

    public static void main(String[] args) {
        new SortArray();
    }
}

运行结果

在这里插入图片描述

反转数组中元素的顺序


实例说明

本实例在GUI窗体中演示数组反转的实现,首先在界面的文本框中输入数组元素,每个元素使用空格分隔。然后点击反转排序法按钮,程序将对数组进行反转算法,并把运算过程中,对数组的改变显示在窗体中。
数组翻转算法
思想:把最后一个元素与第一个元素交换,倒数第二个元素与第二个元素交换,以此类推,直到把所有数组元素反转替换。

设计过程

1.在项目中新建窗体类ReverseSort,在窗体中添加一个文本框,一个文本控件和反转排序法按钮。

2.编写反转排序法按钮的事件处理方法,在该方法中获取用户输入的字符串,然后以空格为分隔符,把字符串拆分成字符串数组,再通过反转算法对数组排序的同时,把反转过程中数组变化输出到文本域中。

测试代码

package com.zhang.exer.day10;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Arrays;

/**
 * @author nanqi-code
 * @create 2021/8/21-8:22
 */
public class ReserveSort extends JFrame {

    //创建文本域
    JTextArea textArea1;
    JTextArea textArea2;
    //创建按钮
    JButton sort;
    //创建标签
    JLabel tip1;
    JLabel tip2;

    public ReserveSort(){
        textArea1 = new JTextArea(25,100);
        textArea2 = new JTextArea(50,100);
        sort = new JButton("反转排序法");
        tip1 = new JLabel("输入数组内容,空格为数组元素分割符");
        tip2 = new JLabel("数组元素反转:");
        //设置窗体标题
        setTitle("反转数组中元素的顺序");
        //设置窗体的位置和大小
        setBounds(250, 250, 457, 400);
        //设置窗体的关闭方式
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        //设置窗体可见
        setVisible(true);
        //设置窗体不可缩放
        setResizable(false);
        //设置布局方式为空布局
        setLayout(null);

        //设置各组件在窗口中的位置和大小
        tip1.setBounds(20, 8, 300, 45);
        tip2.setBounds(20, 69, 300,45);
        textArea1.setBounds(20, 50, 400, 20);
        textArea2.setBounds(20, 108, 400, 180);
        sort.setBounds(142, 318, 130, 25);

        //为按钮添加事件监听器
        sort.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String text = textArea1.getText();//获取用户输入
                String[] arrayStr = text.split(" {1,}");//拆分输入为数组
                int len = arrayStr.length;//获取数组长度
                textArea2.setText("");//清空文本域空间内容
                for (int i = 0; i < len/2; i++) {//反转数组元素
                    String temp = arrayStr[i];
                    arrayStr[i] = arrayStr[len-i-1];
                    arrayStr[len-i-1] = temp;
                    for (String str:arrayStr//在文本域控件显示数组排序过程
                         ) {
                        textArea2.append(str+"  ");
                    }
                    textArea2.append("\n");
                }
            }
        });
        textArea1.addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent e) {
                char key = e.getKeyChar();//获取用户按键字符
                String mask = "0123456789" + (char)32;//定义规范化字符模板
                if(mask.indexOf(key)  == -1){//判断按键字符是否属于规范化字符范围
                    e.consume();//取消非规范化字符的输入有效性
                }
            }

            @Override
            public void keyPressed(KeyEvent e) {

            }

            @Override
            public void keyReleased(KeyEvent e) {

            }
        });


        //将各组件添加到窗口中去
        add(textArea1);
        add(textArea2);
        add(sort);
        add(tip1);
        add(tip2);

    }

    public static void main(String[] args) {
        new ReserveSort();
    }

}


运行结果

在这里插入图片描述

往日精彩

Java编程练习Day09–》数组排序与查询01
Java编程练习Day08
Java编程练习Day07
Java编程练习Day06
Java编程练习Day05
Java编程练习Day04
Java编程练习Day03
Java编程练习Day02
Java编程练习Day01
在这里插入图片描述

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

难啊楠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值