排序算法練習-插入排序(優化)

介紹

插入排序是一種時間複雜度爲O(n2)級別的排序算法。那麼爲什麼我們還要學習時間複雜度爲O(n2)級別的算法呢?因爲在有的時候插入排序反而更快,比如對一個近乎有序的數組或者元素值的波動範圍比較小的情況下,插入排序有天然的優勢。插入排序的思想也可以應用到更高級別的算法中,能夠幫助我們進一步優化排序。

具體思路

  • 設定一個索引值 i,索引到第2個元素的位置。
  • 再設定一個索引值 j,使 j = i 。再讓當前 j 索引的元素與其前一個元素比較,如果不符合需要排定的順序,就交換,直到滿足需要排定順序的要求。
  • 以此類推,直到把之後的元素都遍歷完。

代碼實現

下面用C++實現一個基本的插入排序算法:

#include<bits/stdc++.h>
using namespace std;

template<class T>
void insertionSort(T arr[], int n) {
    //從第二個元素開始
    for(int i = 1; i < n; i++) {
        for(int j = i; j > 0; j--) {
            //依次與前一個元素比較
            if(arr[j-1] > arr[j]) 
                swap(arr[j-1], arr[j]);
        }
    }
    return;
}

int main(int argc, char const *argv[])
{
    // 測試
    int arr[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
    insertionSort(arr, 10);
    for(int i = 0; i < 10; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

優化

很多時候我們都需要對我們的代碼進行優化,上面的代碼也有可以優化的地方。這是我寫的一個優化的插入排序。

#include<bits/stdc++.h>
using namespace std;

template<class T>
void insertionSortAd(T arr[], int n) {
    //從第二個元素開始
    for(int i = 1; i < n; i++) {
        //備份當前值
        T temp = arr[i];
        int j;
        for(j = i; j > 0 && arr[j-1] > temp; j--) {
            //當前面的元素不滿足排序要求,覆蓋到後面的位置,直到滿足排序要求
            arr[j] = arr[j-1];
        }
        //此時 j 所在的位置就是temp該在的位置
        arr[j] = temp;
    }
    return;
}

int main(int argc, char const *argv[])
{
    // 測試
    int arr[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
    insertionSortAd(arr, 10);
    for(int i = 0; i < 10; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

省去了頻繁交換對時間的影響。

最後

  • 由於博主水平有限,難免有疏漏之處,歡迎讀者批評指正!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章