zoukankan      html  css  js  c++  java
  • 数组的简单排序和查找

      本文主要介绍数组的选择排序、冒泡排序两种简单排序算法,以及indexOf和有序数组的二分查找法。

    1. 选择排序

      我们的需求是使用选择排序给 int[] a = { 5, 42, 1, -2, 100 } 数组排序。主要的思路就是[0]号元素逐一和后面的元素比较,如果大则置换位置;之后使用[1]、[2] ......号元素和后面的元素比较,这样就可以实现元素的升序排序。算法大致就是这样的:

      

     1 public static void selectionSort(int[] array){
     2     int tmp = 0;
     3     for (int i = 0; i < array.length - 1; i++) {
     4         for (int j = i + 1; j < array.length; j++) {
     5             if (array[i] > array[j]) {
     6                 tmp = array[i];
     7                 array[i] = array[j];
     8                 array[j] = tmp;
     9             }
    10         }
    11     }
    12 }

      Java 中的选择排序是这样的:

      

    2. 冒泡排序

      我们再使用冒泡排序给 int[] a = {5, 42, 1, -2, 100} 数组排序,思路就是对数组的元素进行“两两比较”,较大的置换到后面的位置上去。算法大致就是这样的:

      

     1 public static void bubbleSort(int[] array) {
     2     int tmp = 0;
     3     for (int i = 0; i < array.length - 1; i++) {
     4         for (int j = 0; j < array.length - i - 1; j++) {    
     5             if (array[j] > array[j + 1]) {
     6                 tmp = array[j];
     7                 array[j] = array[j + 1];
     8                 array[j + 1] = tmp;
     9             }
    10         }
    11     }
    12 }
    13 
    14 public static void main(String[] args) {
    15     int[] array = {5, 42, 1, -2, 100};
    16     bubbleSort(array);
    17     System.out.println(printArray(array));
    18 }
    19 
    20 输出:
    21 
    22 [ -2, 1, 5, 42, 100 ]

      Java 中的冒泡排序是这样的:

      

    3. indexOf查找元素 

      一个普通的查找方法,即传入待查找元素,返回该元素的下标位置,如果未找到返回 -1

     1 public static int indexOf(int[] arr, int element) {
     2         
     3         // 如果数组为 null 或数组长度为 0,返回 -1
     4         if (arr == null || arr.length == 0)
     5             return -1;
     6 
     7         for (int i = 0; i < arr.length; i++) {
     8             if (arr[i] == element) // 如果元素找到,直接返回 index
     9                 return i;
    10         }
    11         return -1; // 如果没有,返回 -1
    12 }

    4. 有序数组的二分查找法

      我们可能都玩过“猜数字”游戏,就是一个人随机想一个1~100的数字,另外一个人猜这个数字,前一个人只能提示猜的大了或是小了,使用的最常见的方式就是从最小值、最大值的中间猜,以此类推最终猜出这个数字。

      二分查找法和上面的游戏类似,它最重要的要求就是数组有序。

      首先比较1 / 2位置的元素和待查找元素:

      如果待查找元素大,再比较3 / 4位置的元素 ......

      如果待查找元素小,再比较1 / 4位置的元素 ......

      ......

      如果使用上面的方式找到了元素,则返回位置;

      如果没有找到元素,一种方式是返回-1,另外一种是返回可以插入位置的下标-(min+1)

      代码如下:

     1 public static int binarySearch(int[] arr, int element){
     2         int min = 0;
     3         int max = arr.length - 1;
     4         int mid = 0;
     5 
     6         while (max >= min) {
     7             mid = (min + max) >> 1;
     8 
     9             if (arr[mid] > element)
    10                 max = mid - 1;
    11             else if (arr[mid] < element)
    12                 min = mid + 1;
    13             else 
    14                 return mid;
    15         }
    16         return -(min+1); // 如果未找到,返回 -( 插入下标 + 1 )
    17 }
    18 
    19 public static void main(String[] args) {
    20 
    21     int[] a = new int[]{ 2, 56, 100, 201, 340 };
    22 
    23     int index = binarySearch(a, 100);
    24     System.out.println(index);
    25 
    26     index = binarySearch(a, 78);
    27     System.out.println(index);
    28 }
    29 
    30 输出:
    31 
    32 2
    33 -3

      如果返回非负数,表示元素存在,且 返回值 = 元素下标

      如果返回负数,表示元素不存在,且 插入位置点 = -( 返回值 + 1 )

      100 元素是数组的第三个元素,下标为 2。78 元素不存在,插入位置点为 2

      JDK 源代码的二分查找法是这样的:

      

  • 相关阅读:
    java 测试 (junit+ junit 断言 + postman)
    junit 运行(eclipse + IDEA)
    junit 常用注解 + junit 断言详解
    工作周报模板
    spring boot tomcat 部署
    spring boot 集成JSP
    spring boot 集成 Mybatis,JPA
    JPA 常用注解
    员工年终绩效考核表模板
    2013 Noip提高组 Day1
  • 原文地址:https://www.cnblogs.com/xugf/p/8379385.html
Copyright © 2011-2022 走看看