java冒泡排序及面向对象基本概念


前言

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

1、排序算法

Java中的常见排序算法有:冒泡、插入、选择、快速、希尔、归并、堆7种 。

  • 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。
  • 线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。

构建一个乱序的数组用于进行排序

int[] arr=new int[6];//数据必须是可比较的,否则不能进行排序
Random r=new Random();
for(int i=0;i<arr.length;i++)
 arr[i]=r.nextInt(100);

2、冒泡排序

冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为每趟比较将当前数列未排序部分的最大的元素“沉”到数列末端,而小的元素会经由交换慢慢“浮”到数列

for(int i=1;i<arr.length;i++){//用于控制比较次数
 for(int k=0;k<arr.length-i;k++){
 	if(arr[k]>arr[k+1]){
 	int temp=arr[k];
	arr[k]=arr[k+1];
	arr[k+1]=temp;
 	}
 }
}

循环执行次数:(n-1)+(n-2)+(…)+(1)=(n*n-n)/2
平均时间复杂度为O(n平方) 空间复杂度O(1) 稳定的排序算法
练习:随机生成一个长度为10的数组,进行排序

import java.util.Random;

public class A1 {

	public static void main(String[] args) {
		int[] arr = new int[10];
		// 生成随机整数,要求取值范围为0-1000
		generateNumber(arr);
		for (int temp : arr)
			System.out.print(temp + "\t");
		System.out.println();
		bubble(arr);
		for (int temp : arr)
			System.out.print(temp + "\t");
		System.out.println();
	}
//冒泡排序
	private static void bubble(int[] arr) {
		long start=System.currentTimeMillis();//獲取執行到這條語句的系統當前時,單位為毫秒 1970-1-1 0:0:0
		for (int k = 1; k < arr.length; k++) {
			for (int i = 0; i < arr.length - k; i++) {
				//(9+8+...+1)=45=(10-1)*10/2=(n-1)*n/2=n*n/2+n/2---->O(n*n)  執行時間和n的平方成正相關
				if (arr[i] > arr[i + 1]) {
					//衡量一個算法的優劣常用的方法是時間複雜度和空間複雜度
					//空間複雜度  O(1)   常量
					int temp = arr[i];
					arr[i] = arr[i + 1];
					arr[i + 1] = temp;
				}
			}
		}
		long end=System.currentTimeMillis();
		System.out.println("排序所需要的時間為"+(end-start)+"ms");
	}
//生成隨機整數數組
	private static void generateNumber(int[] arr) {
		Random r = new Random();
		for (int i = 0; i < arr.length; i++) {
			arr[i] = r.nextInt(1000);
		}
	}

}

练习题:
键盘录入多个整数,点e表示输入完成,将所有录入数据放入数组,然后进行从大到小排序显示
自定义方法,用于实现向数组中追加数据,并且将原始数组长度加1

import java.util.Scanner;

public class Work03 {
    //练习题:
    //键盘录入多个整数,点e表示输入完成,将所有录入数据放入数组,然后进行从大到小排序显示
    //自定义方法,用于实现向数组中追加数据,并且将原始数组长度加1
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] arr = new int[10];
        while (true) {
            System.out.println("请输入正整数数字,按e结束");
            String str = sc.nextLine();
            if ("e".equals(str)) {
                break;
            }
            try {
                int a = Integer.parseInt(str);
                if (a != 0) {
                    //将输入的数字加入数组中
                 arr= method01(arr,a);

                } else {
                    System.out.println("请非0的整数数字");
                }
            } catch (Exception e) {
                System.out.println("输入不合法,请重新输入");
            }
        }

        method02(arr);
        method03(arr);
    }
    public static int[] method01(int[] arr, int a){
       int[] brr=arr;
       int aa =-1;
        for(int q=0;q<arr.length;q++){
            if(arr[q]==0){
                aa=q;
                break;
            }
        }
        if(aa ==-1){
            brr=new int[arr.length+1];
            for(int w=0;w<arr.length;w++){
                brr[w]=arr[w];
            }
            brr[arr.length]=a;
        }else{
            arr[aa]=a;
        }
        return brr;
    }

    public static void method02(int[] arr){
        if(arr==null||arr.length<=1){
            return ;
        }
        for(int a =1; a<arr.length;a++){
            for(int b =0;b<arr.length-a;b++){
                    if(arr[b]>arr[b+1]){
                        int aa =arr[b];
                        arr[b]=arr[b+1];
                        arr[b+1]=aa;
                    }
            }
        }
    }
    public static void method03(int[] arr){
        for(int a : arr){
            System.out.print(a+"\t");
        }
    }
}

3、面向对象

面向对象的三大基本特征是:封装、继承、多态

  • 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据
  • 继承是为了重用父类代码,同时为实现多态性作准备
  • 多态性是发送消息给某个对象,让该对象自行决定响应何种行为。通过将子类对象引用赋值给超类对象引用 变量来实现动态方法调用。

面向过程是一种自上而下的程序设计方法,主要思路专注于算法的实现

  • 过程式的特征是以函数为中心,用函数作为划分程序的基本单位;数据在过程式设计中处于从属的位置
  • 过程式设计的优点是易于理解和掌握,这种逐步细化问题的设计方法与大多数人的思维方式比较接近
  • 软件代码的重用性很差,即使重用,也是简单的复制和拷贝,代码数量急剧增加。而不能直接继承和应用

面向对象是一种自下而上的程序设计方法,以数据为中心,类是表现数据的单位,是划分程序的基本单位

  • 面向对象设计是自下而上的特性,允许开发者从问题的局部开始,在开发过程中逐步加深对系统的理解。需 求变化会作用到系统开发本身,形成一种螺旋式的开发方式
  • 面向对象设计中,类封装了数据,而类的成员函数作为其对外的接口,抽象地描述类,用类将数据和操作这 些数据的函数放在一起,这就是面向对象设计方法的本

类就是模板,也可以说类就是创建对象的基地,能产生出很多不同的对象

  • java语言与其他面向对象语言一样,引入类的概念是用来创建对象的模板,它包含被创建对象的状态描述和方 法的定义。java是面向对象语言,它的源文件是由若干个类组成,源文件的扩展名为.java的文本文件
  • 要学习java编程就必须学会怎样去编写类,即怎样用java的语法去描述一类事物共有的属性和功能。属性通过 变量来刻画,功能通过方法来体现,即方法操作属性形成一定的算法来实现一个具体的功能

类把数据和对数据的操作封装成一个整体

  • 数据是描述某种类型的相关参数
  • 操作是允许执行的动作

一切事物皆对象

抽象是从特定的实例中抽取共同的性质以形成一般化概念的过程

  • 把众多的事物归纳、划分成类是我们在认识世界时经常采用的方法
  • 分类所依据的原则是抽象,也就是忽略事物的非本质特征,只注意那些与当前目标有关的本质特征
  • 找出事物的共性并将具有共同性质的事物划分为同一个类

如面向对象的分析OOA、面向对象的设计OOD以及面向对 象的编程实现OOP

对象是要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表 示抽象的规则、计划或事件

在现实世界中:是客观世界中的一个实体
在计算机世界中:是一个可标识的存储区域
现实世界中所有的事物都是对象 对象都具有某些特征,并展现某些行为

对象的两个要素
属性

  • 描述对象静态特性(结构特性)的一个数据项, 描述一个人可用姓名、性别、身份证号等属性
  • 方法(也称服务) 用于描述对象动态特性(行为特性)的一个操作系列,每个人都具有工作、学习等行为特性
  • 对象将数据和施加于数据上的操作打包成一个不可分割的最基本的模块,使得仅有该类的有限个方法才可以 操纵、改变这些数据,

对象的状态和行为

  • 对象具有状态,一个对象用数据值来描述它的状态 对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为
  • 对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值