数组排序、递归——(Java学习笔记二)

升序:

选择排序:

选定一个元素,一次和后面的元素相比较,如果选定的元素大雨后面的比较元素,就交换位置

先出现最小值,最后出现最大值。

 public static void main(String[] args) {
  int[] arr = {5,8,9,12,55,565,421,12,2512,-5,-56};
  sortMethod(arr);
  p(arr);
 }
   //排序核心代码
 private static void sortMethod(int arr[]) {
  for(int i = 0 ;i<arr.length - 1;i++){
   for(int j = i + 1;j<arr.length;j++){
    if(arr[i] > arr[j]){
     int temp = arr[j];
      arr[j] = arr[i];
      arr[i] = temp;
    }
   }
  }
 }

//打印数组元素
 static void p(int[] arr) {
  String ret = "[";
  for(int i = 0;i<arr.length;i++){
   ret += arr[i];
   if(i == arr.length - 1){
    ret += "]";
   }else{
    ret += ",";
   }
  }
  System.out.println("---------->"+ret);

  

冒泡排序:

相邻两个元素依次相比较

先出现最大值,最后出现最小值。

public static void main(String[] args) {
  int arr[] = {6,9,4589,442,458,5232,-788,7,545,-44,55,-11};
  sortMethod(arr);
  p(arr);
 }
 private static void p(int[] arr) {
  String ret = "[";
  for(int i = 0; i < arr.length; i ++){
   ret += arr[i];
   if( i == arr.length - 1){
    ret += "]";
   }else{
    ret += ",";
   }
  }
  System.out.println("---------->" + ret);
 }
 private static void sortMethod(int[] arr) {
  for(int j = 1;j<arr.length - 1;j++){
   for(int i = 0; i <arr.length - j;i++){
    if(arr[i] > arr[i + 1]){
     int temp = arr[i];
     arr[i] = arr[i + 1];
     arr[i + 1] = temp;
    }
   }
  }
 }

二分查找法:

先对代码进行排序,再取中间值,再拿指定值跟中间值进行比较,如果小于中间值,查找范围就变成最小的索引值到中间值索引减1,如果指定值大于中间值,则查找范围变成中间值索引加1到最大的索引值。

优点:缩小查找范围,提高性能

 1 //查找指定数组指定元素的索引值。
 2 public static void main(String[] args) {
 3   int[] arr = {5,4,231,45,75,45,11,-11,-21,-45};
 4   int key = 45;
 5   sortMethod(arr);
 6   printSort(arr);
 7   int index = binarySeach(arr,key,0,arr.length - 1);
 8   System.out.println("----------->所求索引值:"+index);
 9  }
10 //二分查找法核心代码
11  private static int binarySeach(int[] arr, int key,int fromIndex,int toInedx) {
12   //最小索引与最大索引
13   //fromIndex 表示从哪个位置开始查找,toIndex表示到那个位置结束
14   int minIndex = fromIndex,maxIndex = toInedx;
15   while(maxIndex >= minIndex){
16    //中间索引
17    int midIndex = (maxIndex + minIndex)/2;
18    //中间索引的值
19    int midIndexVal = arr[midIndex];
20    if(key > midIndexVal){
21     minIndex = midIndex + 1;
22    }else if(key < midIndexVal){
23     maxIndex = midIndex - 1;
24    }else{
25     return midIndex;
26    }
27   }
28   return -1;
29  }
30 //打印排序后的代码
31  private static void printSort(int[] arr) {
32   String ret = "[";
33   for(int i = 0;i<arr.length;i++){
34    ret +=arr[i];
35    if(i == arr.length - 1){
36     ret += "]";
37    }else{
38     ret += ",";
39    }
40   }
41   System.out.println("----------->排序:" + ret);
42  }
43 //对代码进行排序
44  private static void sortMethod(int[] arr) {
45   for(int j = 0;j<arr.length - 1;j++){
46    for(int i = 0;i<arr.length - j - 1;i++){
47     if(arr[i] > arr[i + 1]){
48      int temp = arr[i];
49       arr[i] = arr[i+1];
50       arr[i+1] = temp;
51     }
52    }
53   }
54  }

数组的拷贝:

 1     /**
 2  *
 3  * @author Essence
 4  *arraycopy(Object src, int srcPos, Object dest,int destPos, int length)
 5  *该方法接收四个参数
 6  *object src :原数组,即被拷贝的数组
 7  *int srcPos: 原数组的目标位置 即从哪个位置开始拷贝起
 8  *Object dest:目标数组 即用来存储被拷贝的数组
 9  *int destPos:目标数组中的起始位置,即向目标数组中插入数据的起始位置
10  *int length:要复制的元素数量
11  */
12     public static void main(String[] args) {
13   String[] arr = {"A","B","C","D"};
14   String[] arr1 = new String[5];
15   System.out.println(Arrays.toString(arr1)); // 拷贝之前 : [null, null, null, null, null]
16   System.arraycopy(arr, 1, arr1,2, 3);
17   System.out.println(Arrays.toString(arr1)); //拷贝之后: [null, null, B, C, D]
18
19  }

可变参数:

 1 /**
 2  * Java5 出现的新特性 参数可变
 3  * 可变参数必须作为参数的最后一个参数 ,参数可以直接传递0到n个
 4  *其本质上就是数组
 5  * method(int ... arr)
 6  * @author Essence
 7  *
 8  */
 9     public static void main(String[] args) {
10   int[] arr = {1,2,347,7,78,9};
11   System.out.println(getSum(arr));
12   /**
13    * 可变参数调用特点:
14    * getSum(1,2,34,5)
15    */
16   System.out.println(getSum(1,2,34,5));
17
18  }
19  private static int getSum(int ... arr) {
20   int sum = 0;
21   for(int i = 0;i<arr.length;i++){
22    sum += arr[i];
23   }
24   return sum;
25  }
26  }

可变参数可以当做一位数组来调用:getSum(new int[] {1,2,3,4,5});

也可以直接写参数,个数任意,但是类型必须一致:getSum(1,2,34,5)

递归:

基本思想:自己调用自己

结构:

递归头:定义递归结束的时候,什么时候不调用自身方法。如果没有定义头,将会陷入死循环

递归体:什么时候需要调用自身方法

利用递归解决阶乘问题:

 1   public class Demo{
 2             public static void main(String[] args) {
 3   long sum = factorial(10);
 4   System.out.println(sum);
 5  }
 6  static long factorial(int n){
 7   if(n==1){
 8    return 1;
 9   }else{
10    return n*factorial(n-1);
11   }
12  }
13 }

Java编程思想上的两个题斐波那契数列与吸血鬼数字

斐波那契数列:  

/** 1,1,2,3,5,8,13,21,34* 起那两个数是第三个数的和* 斐波那契数列* F(n) = F(n-1)+F(n-2)*/  方法一:
 private static void fibonacci(int n) {
      int arr[] = new int[n],sum = 0;
      arr[0] = arr[1] = 1;
  for(int i = 2;i<arr.length;i++){
           arr[i] = arr[i - 1] + arr[i-2];
           System.out.println("arr["+i+"] "+arr[i]);
           sum += arr[i];
      }
      System.out.println("斐波那契数列之和:" +sum);
 }
    方法二:
private static int sumFibonacci(int n) {
  if(n<1){
   return 1;
  }else{
   return sumFibonacci(n - 1) + sumFibonacci(n - 2);
  }
 }
 private static void getFibonacci(int n) {
  for(int i = 0;i <= n;i++){
   int f = sumFibonacci(i);
   System.out.print(f + "\t");
   if(i%3 == 0){
    System.out.println();
   }
  }
 }
方法三:
 private static void fibbonacci1(int n){
  int a = 1,b = 1,c = 0 , sum = 0;
  System.out.println(a+"\t"+b+"\t");
  for(int i = 1;i<=n;i++){
   c =a +b;
   a = b;
   b = c;
   sum += c;
   System.out.print(c+"\t");
   if(i%3==0){
    System.out.println();
   }
  }
  System.out.println("斐波那契数列之和:" +sum);
 }

吸血鬼数字:

/**1260=21*60*1827=21*87*2187=27*81*/ 1   private static void vampireNumber1() {
 2   for(int i = 1;i<100;i++){
 3    for(int j = 1;j<100;j++){
 4     if(i*j>1000){
 5      String a = i+""+j;
 6      String b = i*j+"";
 7      if(equals(a,b)){
 8       System.out.println(i+"\t"+j+"\t"+i*j);
 9      }
10     }
11    }
12   }
13  }
14  private static boolean equals(String a, String b) {
15   // TODO Auto-generated method stub
16   char[] aArrays ,bArrays;
17   aArrays = a.toCharArray();
18   bArrays = b.toCharArray();
19   Arrays.sort(aArrays);
20   Arrays.sort(bArrays);
21   if(Arrays.equals(aArrays,bArrays)){
22    return true;
23   }
24   return false;
25  }
时间: 2024-12-17 05:14:08

数组排序、递归——(Java学习笔记二)的相关文章

Java学习笔记二:初始化(一)

1.对象初始化 在使用 new 初始化对象时,系统通常使用默认的构造函数,这个构造函数没有返回值,格式为: public class InitializeTest { private int a; // 默认构造函数 public InitializeTest() { } // 自定义构造函数 public InitializeTest(int a) { this.a = a; } } 虽然在使用 new 创建实例时,返回了这个对象的引用,但是这个与没有返回值的void方法不同 //void方法

Java学习笔记二:数据类型

Java学习笔记二:数据类型 1. 整型:没有小数部分,允许为负数,Java整型分4种:int short long byte 1.1 Int最为常用,一个Int类型变量在内存中占用4个字节,取值范围从-2 147 483 6至2 147 483 647 超过20亿,如果用来存储大于20亿的值,最好使用long型. 1.2  int 与Integer: Java中的数据类型分为基本数据类型和复杂数据类型.Int为前者,integer为后者. Integer是int的封装类,提供了很多转换方法,当

Java学习笔记二:初始化(二)

这里主要学习初始化,分为: 1.变量初始化 2.构造函数初始化 3.数组初始化 4.继承初始化   1.变量初始化 成员初始化分为两种: (1)成员变量初始化 在定义成员变量时,如果没有给变量赋于初始值,系统会给出一个默认值. 这里有两种选择:要么使用系统的默认初始值,要么自己定义初始值. 系统给出的默认输出值为: boolean false char [ ] byte 0 short 0 int 0 long 0 float 0.0 double 0.0 refenece null char初

Java学习笔记二(基础语法)

1 Java 是强类型语言,提供的8中基本数据类型有以下几类: Byte :字节类型,一个字节,有符号的8位的整数.字节类型参与运算的时候,会转化为int类型. byte b;b=3;b=(byte)(b*3);  在这里第二个赋值必须经过强制类型转化,否则会编译出错. short:2个字节,Byte可行可以直接赋值给short,但是反过来需要强制类型转化. int:4字节类型的有符号的整数. long:8个字节类型的有符号的整形 char:2个字节的无符号的类型.采用的是Unicode的编码格

Java学习笔记二:初始化(三)

3.数组初始化 1.数组是一个固定长度的集合,在初始化大小后就不能改变其长度. 数组分配在堆中,并在栈中存有指向该数组的一个引用. class Arr { public static void main(String[] args) { int[] a = {1, 2, 3, 4}; int[] b = a; for (int i = 0; i < b.length; i++) { b[i]++; } for (int i = 0; i < a.length; i++) { System.ou

Java学习笔记二---环境变量

1.环境变量包括: JAVA_HOME,CLASSPATH,PATH 2.设置环境变量的目的: 路径搜索,方便查找到Java的安装路径.方便搜索用到的类.方便命令执行等. 3.各环境变量的含义: ①.JAVA_HOME,指向jdk的安装目录,通过搜索JAVA_HOME来找到jdk. ②.CLASSPATH,指定类的搜索路径,通过搜索CLASSPATH,看是否能找到使用的类. ③,PATH,指定命令的搜索路径,通过搜索PATH,看是否能找到要执行的命令. 4.各环境变量的值: ①.JAVA_HOM

JAVA学习笔记(二)

简单的做了个登录界面,运用了添加事件响应,但添加单选框时没有显示出来. package 界面设计; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class JTextFieldDemo extends JFrame implements ActionListener{ JTextField jtf=new JTextField(10); JPasswordField jpf=new JPassw

黑马程序员——JAVA学习笔记二(语法基础)

1,     Java程序都是以类的形式存在的,所以需要告诉虚拟机需要加载类的位置,那么可以设置classpath变量.classpath变量如果有;,则表示还会在当前目录查找,没有;则不会在当前目录查找. 当然如果没有classpath也会在当前目录查找. 2,    rd删除目录,加/S可以删整个目录,Windows从里向外删除. 3,    一个文件只有一个public类,文件名必须和类名相同,如果不是友好类,则不需要同名. 4,    JAVA一共有50个关键字 关键字是电脑语言里事先定

Java学习笔记二——标识符和关键字

标识符 定义 标识符的定义:对各种变量.方法和类等要素命名时使用的字符序列成为标识符. 简单地说,就是凡是自己可以起名字的地方都叫标识符,都要遵守标识符的规则. 命名规则 标识符只能由字母.下划线"_".美元符号"$"或数字组成 标识符只能以字母.下划线或美元符开头 标识符不能是Java关键字和保留字 标识符大小写敏感,长度无限制 约定俗成 为了能使Java代码更好地维护和美观,通常写Java代码是都会遵循一些约定俗成的规矩,如下: 标识符要起的见名知意,可以由多个