几种排序和二分查找算法

本文详细介绍了四种常见的排序算法:插入排序、冒泡排序、归并排序和快速排序,以及二分查找这一高效的搜索算法。对于每种算法,都进行了深入的探讨和解析。
摘要由CSDN通过智能技术生成

插入排序

  /**
   * 插入排序
   *
   * @param arr array
   */
  static void insertSort(int[] arr) {
    for (int i = 1; i < arr.length; ++i) {
      for (int j = i; j > 0 && arr[j] < arr[j - 1]; --j) {
        arr[j] ^= arr[j - 1];
        arr[j - 1] ^= arr[j];
        arr[j] ^= arr[j - 1];
      }
    }
  }

冒泡排序

  /**
   * 冒泡排序
   *
   * @param arr array
   */
  static void mSort(int[] arr) {
    if (arr == null || arr.length <= 1) return;
    for (int i = 0; i < arr.length; ++i) {
      for (int j = 0; j < arr.length - i - 1; ++j) {
        if (arr[j] > arr[j + 1]) {
          arr[j] ^= arr[j + 1];
          arr[j + 1] ^= arr[j];
          arr[j] ^= arr[j + 1];
        }
      }
    }
  }

归并排序

/**
   * 归并排序
   *
   * @param arr array [2,4,5,3,6]
   * @param start 0
   * @param end array.length - 1
   */
  static void mergeSort(int[] arr, int start, int end) {
    if (start >= end) return;
    int mid = start + (end - start) / 2;
    mergeSort(arr, start, mid);
    mergeSort(arr, mid + 1, end);
    merge(arr, start, mid, end);
  }

  static void merge(int[] arr, int start, int mid, int end) {
    int i = start, j = mid + 1, aux[] = new int[end - start + 1];
    for (int k = start; k <= end; k++) aux[k - start] = arr[k];
    for (int k = start; k <= end; k++) {
      if (i > mid) arr[k] = aux[j++ - start];
      else if (j > end) arr[k] = aux[i++ - start];
      else if (aux[i - start] > aux[j - start]) arr[k] = aux[j++ - start];
      else arr[k] = aux[i++ - start];
    }
  }

快速排序

  /**
   * 快速排序
   *
   * @param arr array [1,2,4,3]
   * @param begin 0
   * @param end array.length - 1
   */
  static void qSort(int[] arr, int begin, int end) {
    if (arr == null || begin > end) return;
    int l = begin, h = end, key = arr[begin];
    while (l != h) {
      while (l < h && key <= arr[h]) --h;
      while (l < h && key >= arr[l]) ++l;
      if (l < h) {
        arr[l] ^= arr[h];
        arr[h] ^= arr[l];
        arr[l] ^= arr[h];
      }
    }
    arr[begin] = arr[l];
    arr[l] = key;
    qSort(arr, begin, l - 1);
    qSort(arr, l + 1, end);
  }

二分查找

  /**
   * 二分查找
   *
   * @param arr array
   * @param tar 目标
   * @return -1 未找到
   */
  static int bSearch(int[] arr, int tar) {
    if (arr == null || arr.length == 0) return -1;
    int l = 0, h = arr.length - 1;
    while (l <= h) {
      int m = l + (h - l) >> 1;
      if (arr[m] > tar) h = m - 1;
      if (arr[m] < tar) l = m + 1;
      if (arr[m] == tar) return m;
    }
    return -1;
  }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值