Java实现常见的排序算法

前言

算法对于工程师来说,是很重要的知识,能直接体现一个人的逻辑思维能力。鉴于此,我实现了常用的几种排序算法,用来加深记忆。

排序算法

冒泡排序

/**
  * 冒泡排序:升序
  *
  * @param array
  * @return
  */
 public static int[] bubbleSortAsc(int[] array) {
     if (array.length == 0) {
         return array;
     }
     for (int i = 0; i < array.length; i++) {
         for (int j = 0; j < array.length - 1 - i; j++) {
             if (array[j] > array[j + 1]) {
                 int temp = array[j];
                 array[j] = array[j + 1];
                 array[j + 1] = temp;
             }
         }
     }
     return array;
 }

选择排序

/**
  * 选择排序:升序
  *
  * @param array
  * @return
  */
 public static int[] selectionSortAsc(int[] array) {
     if (array.length == 0) {
         return array;
     }
     for (int i = 0; i < array.length; i++) {
         int minIndex = i;
         for (int j = i; j < array.length; j++) {
             if (array[j] < array[minIndex]) {
                 minIndex = j;
             }
         }
         int temp = array[minIndex];
         array[minIndex] = array[i];
         array[i] = temp;
     }
     return array;
 }

插入排序

/**
  * 插入排序:升序
  *
  * @param array
  * @return
  */
 public static int[] insertSortAsc(int[] array) {
     if (array.length == 0) {
         return array;
     }
     for (int i = 1; i < array.length; i++) {
         int cur = array[i];
         int index = i - 1;
         while (index >= 0 && array[index] > cur) {
             int temp = array[index];
             array[index] = cur;
             array[index + 1] = temp;
             index--;
         }
     }
     return array;
 }

归并排序

 /**
   * 归并排序:升序
   *
   * @param array
   * @return
   */
  public static int[] mergeSortAsc(int[] array) {
      if (array.length < 2) {
          return array;
      }
      int mid = array.length / 2;
      int[] left = mergeSortAsc(Arrays.copyOfRange(array, 0, mid));
      int[] right = mergeSortAsc(Arrays.copyOfRange(array, mid, array.length));
      for (int i = 0, leftIndex = 0, rightIndex = 0; i < array.length; i++) {
          if (leftIndex >= left.length) {
              array[i] = right[rightIndex++];
          } else if (rightIndex >= right.length) {
              array[i] = left[leftIndex++];
          } else if (left[leftIndex] >= right[rightIndex]) {
              array[i] = right[rightIndex++];
          } else {
              array[i] = left[leftIndex++];
          }
      }
      return array;
  }

快速排序

/**
  * 快速排序:升序
  *
  * @param array
  * @param start
  * @param end
  * @return 分区指示器位置
  */
 public static int[] quickSortAsc(int[] array, int start, int end) {
     if (array.length < 1 || start < 0 || end >= array.length || start > end) {
         return null;
     }
     int zoneIndex = partition(array, start, end);
     if (zoneIndex > start) {
         quickSortAsc(array, start, zoneIndex - 1);
     }
     if (zoneIndex < end) {
         quickSortAsc(array, zoneIndex + 1, end);
     }
     return array;
 }

 private static int partition(int[] array, int start, int end) {
     int pivot = (int) (start + Math.random() * (end - start + 1));
     int zoneIndex = start - 1;
     swap(array, pivot, end);
     for (int i = start; i <= end; i++) {
         if (array[i] <= array[end]) {
             zoneIndex++;
             if (i > zoneIndex) {
                 swap(array, i, zoneIndex);
             }
         }
     }
     return zoneIndex;
 }

 private static void swap(int[] array, int i, int j) {
     int temp = array[i];
     array[i] = array[j];
     array[j] = temp;
 }

结束语

学无止境,诸君共勉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值