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

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.冒泡排序算法spa

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

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

/**
* @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;
}
相關文章
相關標籤/搜索