三個簡單、基本的排序算法---插入排序、選擇排序、冒泡排序


1.插入排序算法
插入排序的基本思想是在遍歷數組的過程中,假設在序號 i (i>=1)之前的元素即 [0..i-1] 都已經排好序,本趟需要找到 i 對應的元素 x 的正確位置 k ,並且在尋找這個位置 k 的過程中逐個將比較過的元素往后移一位,為元素 x “騰位置”,最后將 k 對應的元素值賦為 x ,一般情況下,插入排序的時間復雜度和空間復雜度分別為O(n2) 和 O(1)。(通俗說法:把數組后面那些沒排序的元素換到數組前面已經排好序的部分里對應的位置)
例如:45 80 48 40 22 78
第一輪:45 80 48 40 22 78 ---> 45 80 48 40 22 78 i=1
第二輪:45 80 48 40 22 78 ---> 45 48 80 40 22 78 i=2
第三輪:45 48 80 40 22 78 ---> 40 45 48 80 22 78 i=3
第四輪:40 45 48 80 22 78 ---> 22 40 45 48 80 78 i=4
第五輪:22 40 45 48 80 78 ---> 22 40 45 48 78 80 i=5
(紅色代表此輪要插入的元素,紅色左邊是已經排好序的,右邊是待排序的)

/**
* @param int[] 未排序數組
* @return int[] 排完序數組
*/

public static int[] InsertSort(int[] array){
    for(int i =1;i<array.length;i++){
        int temp = array[i];
        int j = i-1;
        while(j>=0 && temp < array[j] ){
            array[j+1] = array[j];
            j--;
        }
        array[j+1] = temp;
    }
    return array;
}

2.選擇排序算法
選擇排序的基本思想是遍歷數組的過程中,以 i 代表當前需要排序的序號,則需要在剩余的 [i+1,…n-1] 中找出其中的最小值,然后將找到的最小值與 i 指向的值進行交換。因為每一趟確定元素的過程中都會有一個選擇最大值/最小值的子流程,所以人們形象地稱之為選擇排序。選擇排序的時間復雜度和空間復雜度分別為O(n2)和O(1)。(通俗說法:每次把剩余數組里最小的選出來放在數組的前面。所以第一次選出來的就是數組里面最小的,第二次選出來的就是數組里面第二小的,依次。。。。。)
例如:45 80 48 40 22 78
第一輪:45 80 48 40 22 78 ---> 22 80 48 40 45 78 i=0
第二輪:22 80 48 40 45 78 ---> 22 40 48 80 45 78 i=1
第三輪:22 40 48 80 45 78 ---> 22 40 45 80 48 78 i=2
第四輪:22 40 45 80 48 78 ---> 22 40 45 48 80 78 i=3
第五輪:22 40 45 48 80 78 ---> 22 40 45 48 78 80 i=4
(紅色代表此輪需要排序的序號的元素,紅色左邊是已經排好序的,右邊是待排序的)

/**
* @param int[] 未排序數組
* @return int[] 排完序數組
*/

public int[] sortSelect(int[] arr){
    for (int i = 0; i < arr.length-1; i++) {
        int miniPost = i;
        for (int m = i + 1; m < arr.length; m++) {
            if (arr[m] < arr[miniPost])
           miniPost = m;
        }
        if (arr[i] > arr[miniPost]) {
            int temp = arr[i];
            arr[i] = arr[miniPost];
            arr[miniPost] = temp;
        }
    }
    return arr;
}
                        

3.冒泡排序算法

冒泡排序的基本思想是將比較大的數字沉在最下面,較小的浮在上面。

冒泡排序的時間復雜度和空間復雜度分別是O(n^2)和O(1)。

/**
* @param int[] 未排序數組
* @return int[] 排完序數組
*/

public int[] sortBubble(int[] array){
  int temp;
  // 第一層循環:表明比較的次數, 比如 length 個元素,比較次數為 length-1 次(肯定不需和自己比)
  for(int i=0;i<array.length-1;i++){
    for (int j = array.length - 1; j > i; j--) {
      if (array[j] < array[j - 1]) {
        temp = array[j];
        array[j] = array[j - 1];
        array[j - 1] = temp;
      }
    }
  }
  return array;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM