首页 > 编程语言 >数组算法

数组算法

时间:2024-08-02 11:18:41浏览次数:5  
标签:arr int 算法 数组 排序 left

数组的算法

目录


搜索方法

  1. 线性搜索(Linear Search):

    • 算法:遍历数组,直到找到目标值或遍历完数组。

    • 时间复杂度:O(n)。

    • 应用:在未排序的数组中查找元素。

      public int linearSearch(int[] arr, int target) {
          for (int i = 0; i < arr.length; i++) {
              if (arr[i] == target) {
                  return i; // 返回目标元素的索引
              }
          }
          return -1; // 如果未找到,返回-1
      }
      
  2. 二分搜索(Binary Search):

    • 算法:在已排序的数组中,通过比较中间元素与目标值来确定搜索区间,并逐步缩小搜索范围。

    • 时间复杂度:O(log n)。

    • 应用:在已排序的数组中快速查找元素。

      public int binarySearch(int[] arr, int target) {
          int left = 0;
          int right = arr.length - 1;
          while (left <= right) {
              int mid = left + (right - left) / 2;
              if (arr[mid] == target) {
                  return mid; // 找到目标
              } else if (arr[mid] < target) {
                  left = mid + 1;
              } else {
                  right = mid - 1;
              }
          }
          return -1; // 未找到目标
      }
      

    排序方法

  3. 冒泡排序(Bubble Sort):

    • 算法:通过重复遍历数组,相邻元素两两比较并交换位置,直到整个数组排序。

    • 时间复杂度:O(n^2)。

    • 应用:教学和简单场景下的排序。

      public void bubbleSort(int[] arr) {
          boolean swapped;
          for (int i = 0; i < arr.length - 1; i++) {
              swapped = false;
              for (int j = 0; j < arr.length - 1 - i; j++) {
                  if (arr[j] > arr[j + 1]) {
                      // 交换 arr[j] 和 arr[j + 1]
                      int temp = arr[j];
                      arr[j] = arr[j + 1];
                      arr[j + 1] = temp;
                      swapped = true;
                  }
              }
              if (!swapped) break; // 如果没有交换,数组已经排序完成
          }
      }
      
  4. 选择排序(Selection Sort):

    • 算法:找到未排序部分的最小(或最大)元素,将其与未排序部分的第一个元素交换位置。

    • 时间复杂度:O(n^2)。

    • 应用:教学和简单场景下的排序。

      public void selectionSort(int[] arr) {
          for (int i = 0; i < arr.length - 1; i++) {
              int minIndex = i;
              for (int j = i + 1; j < arr.length; j++) {
                  if (arr[j] < arr[minIndex]) {
                      minIndex = j;
                  }
              }
              // 交换最小元素与第一个元素
              int temp = arr[minIndex];
              arr[minIndex] = arr[i];
              arr[i] = temp;
          }
      }
      
  5. 插入排序(Insertion Sort):

    • 算法:构建有序序列,对未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

    • 时间复杂度:O(n^2)。

    • 应用:对小规模数据或部分有序数据的排序。

      public void insertionSort(int[] arr) {
          for (int i = 1; i < arr.length; i++) {
              int key = arr[i];
              int j = i - 1;
              while (j >= 0 && arr[j] > key) {
                  arr[j + 1] = arr[j];
                  j--;
              }
              arr[j + 1] = key;
          }
      }
      
  6. 快速排序(Quick Sort):

    • 算法:选择一个基准元素,将数组分为小于和大于基准的两部分,递归地在这两部分上进行快速排序。

    • 时间复杂度:平均O(n log n),最坏O(n^2)。

    • 应用:高效的通用排序算法。

      public void quickSort(int[] arr, int low, int high) {
          if (low < high) {
              int pivotIndex = partition(arr, low, high);
              quickSort(arr, low, pivotIndex - 1);
              quickSort(arr, pivotIndex + 1, high);
          }
      }
      
      private int partition(int[] arr, int low, int high) {
          int pivot = arr[high];
          int i = (low - 1);
          for (int j = low; j < high; j++) {
              if (arr[j] < pivot) {
                  i++;
                  int temp = arr[i];
                  arr[i] = arr[j];
                  arr[j] = temp;
              }
          }
          int temp = arr[i + 1];
          arr[i + 1] = arr[high];
          arr[high] = temp;
          return i + 1;
      }
      
  7. 归并排序(Merge Sort):

    • 算法:将数组分成两半,递归地对每一半进行归并排序,然后将排序好的两半合并。

    • 时间复杂度:O(n log n)。

    • 应用:对大规模数据的稳定排序。

      public void mergeSort(int[] arr, int left, int right) {
          if (left < right) {
              int mid = (left + right) / 2;
              mergeSort(arr, left, mid);
              mergeSort(arr, mid + 1, right);
              merge(arr, left, mid, right);
          }
      }
      
      private void merge(int[] arr, int left, int mid, int right) {
          int n1 = mid - left + 1;
          int n2 = right - mid;
      
          int[] leftArr = new int[n1];
          int[] rightArr = new int[n2];
      
          for (int i = 0; i < n1; ++i) {
              leftArr[i] = arr[left + i];
          }
          for (int j = 0; j < n2; ++j) {
              rightArr[j] = arr[mid + 1 + j];
          }
      
          int i = 0, j = 0;
          int k = left;
          while (i < n1 && j < n2) {
              if (leftArr[i] <= rightArr[j]) {
                  arr[k] = leftArr[i];
                  i++;
              } else {
                  arr[k] = rightArr[j];
                  j++;
              }
              k++;
          }
      
          while (i < n1) {
              arr[k] = leftArr[i];
              i++;
              k++;
          }
      
          while (j < n2) {
              arr[k] = rightArr[j];
              j++;
              k++;
          }
      }
      
  8. 计数排序(Counting Sort):

    • 算法:使用额外的数组来统计每个元素出现的次数,然后根据这些计数来确定元素的排序位置。
    • 时间复杂度:O(n + k),k是元素范围。
    • 应用:当元素范围不大且需要稳定排序时。

排序算法库

排序算法库提供了一组预先实现的排序函数,这些函数可以高效地对数据进行排序。

Java 提供了 Arrays.sort() 方法,可以对数组进行排序。对于对象数组,可以使用 Arrays.sort() 的变体,传入自定义的比较器。

import java.util.Arrays;

int[] myArray = {5, 3, 8, 6, 2};
Arrays.sort(myArray); // 对整型数组进行排序

// 对对象数组使用自定义比较器
class MyObject implements Comparable<MyObject> {
    int value;
    // 实现 compareTo 方法
    public int compareTo(MyObject other) {
        return this.value - other.value;
    }
}

MyObject[] objects = ...;
Arrays.sort(objects); // 自然排序

标签:arr,int,算法,数组,排序,left
From: https://www.cnblogs.com/jmy3/p/18338358

相关文章

  • 一维数组
    一维数组一维数组是数组的一种形式,它包含单一维度的元素。创建数组int[]myArray=newint[10];//创建一个长度为10的整型数组遍历数组:可以使用循环结构(如for循环)来遍历数组中的每个元素。例如:javafor(inti=0;i<myArray.length;i++){System.out.println(my......
  • 多维度数组
    多维度数组多维度数组(也称为多维数组或数组的数组)是一种数据结构,它由多个一维数组组成,每个一维数组称为子数组。多维数组可以有任意数量的维度,但最常用的是二维和三维数组。基本概念维度:多维数组的每个“层次”称为一个维度。例如,二维数组有两个维度,三维数组有三个维度。子数......
  • 代码随想录算法训练营第57天 | 并查集理论基础
    并查集理论基础https://www.programmercarl.com/kamacoder/图论并查集理论基础.html107.寻找存在的路径https://kamacoder.com/problempage.php?pid=1179代码随想录https://www.programmercarl.com/kamacoder/0107.寻找存在的路径.html#思路并查集理论基础并查集用于判断......
  • 随机生成10个整数(1-100的范围)保存到数组,并倒序打印以及求平均值、求最大值和最大值
    1publicclassshuzu19{2//编写一个main方法3publicstaticvoidmain(String[]args){4/*5随机生成10个整数(1-100的范围)保存到数组6并倒序打印以及求平均值、求最大值和最大值的下标、7并查找里面是否有88......
  • 数组的算法
    数组的算法常见排序算法主要有:冒泡排序,选择排序,计数排序,基数排序,堆排序,桶排序,归并排序,希尔排序,插入排序,快速排序等等。冒泡排序(BubbleSort):两个for循环(外面的遍历数组,数组最后个元素不用遍历,因为要两两比较。里面的进行两两比较)通过重复遍历要排序的数列,比较每对相邻......
  • 数组
    数组概念数组是一种数据结构,用于存储固定大小的同类型元素序列。数组可以是一维的,也可以是多维的(例如二维、三维等)。声明数组:在Java中,声明数组需要指定元素的数据类型和数组的名称。例如,声明一个整型一维数组可以写作:int[]myArray;声明并分配内存空间,但不初始化元素:int[]......
  • 解密编程的八大法宝(四)(附二分查找、分治法和图论算法(深度和广度优先搜索、最短路径、最
    算法题中常见的几大解题方法有以下几种::暴力枚举法(BruteForce):这是最基本的解题方法,直接尝试所有可能的组合或排列来找到答案。这种方法适用于问题规模较小的情况,但在大多数情况下效率不高。贪心算法(GreedyAlgorithm):贪心算法在每一步都选择当前看起来最优的解,希望最终能......
  • 从零开始学嵌入式技术之C语言09:数组
    一:数组的概念(1)概念        数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个标识符命名,并通过编号(索引,亦称为下标或角标)的方式对这些数据进行统一管理。    数组名:本质上是一个标识符常量,命名需要符合标识符规范。元素:同一个数组中的元素必须是相......
  • vue生成初始化名字相近的变量并放到数组中
    项目上有一个需求,页面上有50、60个数据变量,是依次排序递增的变量,中间有个别变量用不到,不想把这些变量直接定义在data(){}内。直接上代码1.在mounted(){},大括号内定义并初始化变量1this.yx_1hddj_arr=[];2this.yx_2hddj_arr=[];3this.yx_3hddj_arr......
  • 轮转数组的Java实现
    轮转数组给定一个整数数组nums,将数组中的元素向右轮转k个位置,其中k是非负数。输入:nums=[1,2,3,4,5,6,7],k=3输出:[5,6,7,1,2,3,4]解释:向右轮转1步:[7,1,2,3,4,5,6]向右轮转2步:[6,7,1,2,3,4,5]向右轮转3步:[5,6,7,1,2,3,4]解法1:把数组看成......