常见排序算法原理与实现



1.冒泡排序


基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

Java实现:


import java.util.Arrays;

public class BubbleSort {

  public static void bubbleSort(int[] arr) {

    int temp = 0;
    for (int i = 0; i < arr.length - 1; i++) {
      for (int j = 0; j < arr.length - 1 - i; j++) {
        if (arr[j] > arr[j + 1]) {
          temp = arr[j];
          arr[j] = arr[j + 1];
          arr[j + 1] = temp;
        }
      }
    }
  }

  public static void main(String[] args) {
    int[] arr={1,3,5,3,2,6,9,5,8};
    bubbleSort(arr);
    System.out.println(Arrays.toString(arr));
  }

}


2.快速排序


基本思想:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

Java实现:

public static void quickSort(int[] arr) {
    qsort(arr, 0, arr.length - 1);
  }

  private static void qsort(int[] arr, int low, int high) {
    if (low < high) {
      int pivot = partition(arr, low, high); // 将数组分为两部分
      qsort(arr, low, pivot - 1); // 递归排序左子数组
      qsort(arr, pivot + 1, high); // 递归排序右子数组
    }
  }

  private static int partition(int[] arr, int low, int high) {
    int pivot = arr[low]; // 枢轴记录
    while (low < high) {
      while (low < high && arr[high] >= pivot){
        high--;
      }
        
      arr[low] = arr[high]; // 交换比枢轴小的记录到左端
      
      while (low < high && arr[low] <= pivot){
        low++;
      }
        
      arr[high] = arr[low]; // 交换比枢轴大的记录到右端
    }
    // 扫描完成,枢轴到尾
    arr[low] = pivot;
    
    // 返回的是枢轴的位置
    return low;
  }

3.选择排序



基本原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。


Java实现:



private static void selectionSort(int[] array) {
    // 每次循环找出相对最小值,并交换到头部
    for (int i = 0; i < array.length - 1; i++) {
      int min = i;
      for (int j = i+1; j < array.length; j++) {
        if (array[j] < array[min])
          min = j;

      }
      int temp = array[min];
      array[min] = array[i];
      array[i] = temp;

    }
  }



4.插入排序



基本步骤:

1. 从第一个元素开始,该元素可以认为已经被排序

2. 取出下一个元素,在已经排序的元素序列中从后向前扫描

3. 如果该元素(已排序)大于新元素,将该元素移到下一位置

4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置

5. 将新元素插入到该位置后

6. 重复步骤 2 ~ 5


Java实现:



<pre name="code" class="java">// 插入排序
  private static void insertSort(int[] arr) {

    int key = 0, j = 0;

    for (int i = 1; i < arr.length; i++) { // 默认第一个元素(下标从0开始)已经有序
      key = arr[i]; // 待排序元素
      j = i - 1;
      while (j >= 0 && arr[j] > key) { // 待排序数较小
        arr[j + 1] = arr[j]; // 后移
        j--;
      }

      arr[j + 1] = key; // 插入待排序元素
    }
  }