Java数组高级算法与Arrays类常见操作小结【排序、查找】

本文实例讲述了Java数组高级算法与Arrays类常见操作。分享给大家供大家参考,具体如下:

冒泡排序

冒泡排序原理

冒泡排序代码:

package cn.itcast_01;
/*
 * 数组排序之冒泡排序:
 *     相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处
 */
public class ArrayDemo {
  public static void main(String[] args) {
    // 定义一个数组
    int[] arr = { 24, 69, 80, 57, 13 };
    System.out.println("排序前:");
    printArray(arr);
    bubbleSort(arr);
    System.out.println("排序后:");
    printArray(arr);
  }
  //冒泡排序代码
  /*总共需要比较数组长度-1次,x < arr.length - 1
   *每一次比较完,下一次就会减少一次元素的比较。第一次比较有0个元素不比,第二次有1个元素不比,,,,所以 y < arr.length - 1 - x
   *两两比较,大的往后放
   * */
  public static void bubbleSort(int[] arr){
    for (int x = 0; x < arr.length - 1; x++) {
      for (int y = 0; y < arr.length - 1 - x; y++) {
        if (arr[y] > arr[y + 1]) {
          int temp = arr[y];
          arr[y] = arr[y + 1];
          arr[y + 1] = temp;
        }
      }
    }
  }
  // 遍历功能
  public static void printArray(int[] arr) {
    System.out.print("[");
    for (int x = 0; x < arr.length; x++) {
      if (x == arr.length - 1) {
        System.out.print(arr[x]);
      } else {
        System.out.print(arr[x] + ", ");
      }
    }
    System.out.println("]");
  }
}

选择排序

选择排序原理图

选择排序代码

package cn.itcast_02;
/*
 * 数组排序之选择排序:
 *     从0索引开始,依次和后面元素比较,小的往前放,第一次完毕,最小值出现在了最小索引处
 */
public class ArrayDemo {
  public static void main(String[] args) {
    // 定义一个数组
    int[] arr = { 24, 69, 80, 57, 13 };
    System.out.println("排序前:");
    printArray(arr);
    //用方法改进
    selectSort(arr);
    System.out.println("排序后:");
    printArray(arr);
  }
  /*
   * 数组排序
   * */
  public static void selectSort(int[] arr){
    for(int x=0; x<arr.length-1; x++){
      for(int y=x+1; y<arr.length; y++){
        if(arr[y] <arr[x]){
          int temp = arr[x];
          arr[x] = arr[y];
           arr[y] = temp;
        }
      }
    }
  }
  // 遍历功能
  public static void printArray(int[] arr) {
    System.out.print("[");
    for (int x = 0; x < arr.length; x++) {
      if (x == arr.length - 1) {
        System.out.print(arr[x]);
      } else {
        System.out.print(arr[x] + ", ");
      }
    }
    System.out.println("]");
  }
}

二分查找法

二分查找法原理

二分法的代码实现:

package cn.itcast_04;
/*
 * 查找:
 *     基本查找:数组元素无序(从头找到尾)
 *     二分查找(折半查找):数组元素有序
 *
 * 分析:
 *     A:定义最大索引,最小索引
 *     B:计算出中间索引
 *     C:拿中间索引的值和要查找的值进行比较
 *       相等:就返回当前的中间索引
 *       不相等:
 *         大  左边找
 *         小  右边找
 *     D:重新计算出中间索引
 *       大  左边找
 *         max = mid - 1;
 *       小  右边找
 *         min = mid + 1;
 *     E:回到B
 */
public class ArrayDemo {
  public static void main(String[] args) {
    //定义一个数组
    int[] arr = {11,22,33,44,55,66,77};
    //写功能实现
    int index = getIndex(arr, 33);
    System.out.println("index:"+index);
    //假如这个元素不存在后有什么现象呢?
    index = getIndex(arr, 333);
    System.out.println("index:"+index);
  }
  /*
   * 两个明确:
   * 返回值类型:int
   * 参数列表:int[] arr,int value
   */
  public static int getIndex(int[] arr,int value){
    //定义最大索引,最小索引
    int max = arr.length -1;
    int min = 0;
    //计算出中间索引
    int mid = (max +min)/2;
    //拿中间索引的值和要查找的值进行比较
    while(arr[mid] != value){
      if(arr[mid]>value){
        max = mid - 1;
      }else if(arr[mid]<value){
        min = mid + 1;
      }
      //加入判断
      if(min > max){
        return -1;
      }
      mid = (max +min)/2;
    }
    return mid;
  }
}

Arrays类

package cn.itcast_05;
import java.util.Arrays;
/*
 * Arrays:针对数组进行操作的工具类。比如说排序和查找。
 * 1:public static String toString(int[] a) 把数组转成字符串
 * 2:public static void sort(int[] a) 对数组进行排序
 * 3:public static int binarySearch(int[] a,int key) 二分查找
 */
public class ArraysDemo {
  public static void main(String[] args) {
    // 定义一个数组
    int[] arr = { 24, 69, 80, 57, 13 };
    // public static String toString(int[] a) 把数组转成字符串
    System.out.println("排序前:" + Arrays.toString(arr));
    // public static void sort(int[] a) 对数组进行排序
    Arrays.sort(arr);
    System.out.println("排序后:" + Arrays.toString(arr));
    // [13, 24, 57, 69, 80]
    // public static int binarySearch(int[] a,int key) 二分查找
    System.out.println("binarySearch:" + Arrays.binarySearch(arr, 57));
    System.out.println("binarySearch:" + Arrays.binarySearch(arr, 577));
  }
}

PS:这里再为大家推荐几款相似的在线工具供大家参考:

在线动画演示插入/选择/冒泡/归并/希尔/快速排序算法过程工具:
http://tools.jb51.net/aideddesign/paixu_ys

在线JS常见遍历方式性能分析比较工具:
http://tools.jb51.net/aideddesign/js_bianli

更多关于java相关内容感兴趣的读者可查看本站专题:《Java数组操作技巧总结》、《Java字符与字符串操作技巧总结》、《Java数学运算技巧总结》、《Java数据结构与算法教程》及《Java操作DOM节点技巧总结》

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • Java中数组在内存中存放原理的讲解

    Java中数组被实现为对象,它们一般都会因为记录长度而需要额外的内存.对于一个原始数据类型的数组,一般需要24字节的头信息再加上保存值所需的内存,其中24字节的头信息分别包含以下几个部分. 下面分别分析一维.二维.三维的数组存储情况. 下面首先对一维数组进行分析,以int[]型数组为例,假设数组长度为N,那么需要的内存占用(24+4N)个字节,原因分析比较简单,图解示例如下:即占用内存总量=头信息内存+数组N个int值占用内存. 对于二维数组进行分析,首先对于多维数组的概念,大家可以参考这篇文章

  • Java实现删除排序数组中重复元素的方法小结【三种方法比较】

    本文实例讲述了Java实现删除排序数组中重复元素的方法.分享给大家供大家参考,具体如下: 题目描述: 给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度. 不要使用额外的数组空间,必须在原地没有额外空间的条件下完成. 一:通过ArrayList解决 时间复杂度和空间复杂度都为O(n) ArrayList<Integer> list = new ArrayList<Integer>(); // 去掉数组中重复的元素 public int r

  • Java算法实现调整数组顺序使奇数位于偶数之前的讲解

    调整数组顺序使奇数位于偶数之前 1. 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 2. 题目分析 该题目类似于一个选择排序,将奇数选择出来,放置于数据前面的位置,保持其他未被选择的元素的相对位置不变: 1. 遍历数组,当数组元素为奇数是进行处理,判断条件为 n % 2 != 0 2. 设置一个变量标注当前已遍历的元素中奇数的个数oddNum,也是将该奇数元素

  • Java中字符数组和字符串与StringBuilder和字符串转换的讲解

    1.字符串->字符数组: String str = "abc": char[] a = str.toCharArray(); 记忆:字符串是个类,所以用内建函数 延伸: char b = str.charAt(1); str.length(); a.length; 2.字符数组->字符串: String str = String.valueOf(a): 记忆:类似强制类型转换格式,String(a) 延伸:字符转字符类 Character c = Character.val

  • java实现数组中的逆序对

    在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对,例如在数组{7,5,6,4}中,一共存在5对逆序对,分别是{7,6},{7,5},{7,4},{6,4},{5,4}.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出.,即输出P%1000000007. 代码 解法一 暴力简单低效,不会改变原数组 public static int inversePairs(int[] array) { if (array == null ||

  • Java Scanner输入两个数组的方法

    题目 从命令行读入两个数组的长度和数组的值,其中第一行两个数na和nb代表aa和bb数组的长度 代码 import java.util.Scanner; public class Z { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int na = scanner.nextInt(); int nb = scanner.nextInt(); int[] aa = new in

  • Java如何找出数组中重复的数字

    题目描述:找出数组中重复的数字,具体内容如下 在一个长度为n的数组里的所有数字都在 0~n-1的范围内.数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复了几次.请找出数组中任意一个重复的数字.例如:如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出的是重复的数字2或者3 这个面试题是剑指offer中的面试题3,,下面我用java代码实现. 算法步骤: 从头到尾依次扫描数组中的每个数字. 1. 当扫描到下表为i的数字时,首先比较这个数字(用m表示)是不是等

  • 浅谈JAVA实现选择排序,插入排序,冒泡排序,以及两个有序数组的合并

    一直到大四才开始写自己的第一篇博客,说来实在有点羞愧.今天写了关于排序的算法题,有插入排序,冒泡排序,选择排序,以下贴上用JAVA实现的代码: public class test5 { public static void print(int []array) //输出数组方法 { for(int i=0;i<array.length;i++) System.out.print(" "+array[i]); } public static void selectsort(int

  • java集合与数组的相同点和不同点

    数组: 数组可以用来保存多个基本数据类型的数据,也可以用来保存多个对象. 数组的长度是不可改变的,一旦初始化数组时就指定了数组的长度(无论是静态初始化还是动态初始化). 数组无法保存具有映射关系的数据. 集合: 集合是只用于存储数量不等的对象. 集合的长度是可变的. 集合可以保存具有映射关系的数据. 相同点: 数组和集合类同是容器. 不同点: 数组的长度是固定的,集合的长度是可变的. 数组只能存储同类型的对象,集合可以存储不同类型的对象. 集合只能存储对象不能存储基本类型 总结 以上就是这篇文章

  • java实现二分法查找出数组重复数字

    本文实例为大家分享了java实现二分法查找出数组重复数字的具体代码,供大家参考,具体内容如下 package offer; /** * 二分查找的思想来找到数组中重复的数字,时间复杂度在o(nlogn)-o(n^2) */ public class FindDuplicate3 { public static void main(String[] args) { int numbers[] = {0,1,2,3,4,4,6,7};//数组中的数 大小从0 到 numbers.length-1 f

随机推荐