iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0
自我挑戰組

C++ AI 起步:編程進入智能世界系列 第 18

排序演算法 : Tim排序法

  • 分享至 

  • xImage
  •  

Tim排序是一種混合的、穩定的、比較式的排序演算法,結合了合併排序和插入排序的技巧。它首先被實現在Python的sorted()函數和Java的Arrays.sort()中,並已被證明在各種情況下都具有優越的性能。

Tim排序法簡介
Tim排序法的工作原理是:

  1. 初始時,將資料分為小塊
  2. 使用插入排序對每一個小塊進行排序。
  3. 進行合併操作,相似於合併排序,但加入了一些技巧以改善其性能。

C++實現
以下是使用C++實現的Tim排序法的簡化版本:

#include <iostream>
#include <vector>

const int RUN = 32;

void insertionSort(std::vector<int>& arr, int left, int right) {
    for (int i = left + 1; i <= right; i++) {
        int temp = arr[i];
        int j = i - 1;
        while (arr[j] > temp && j >= left) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = temp;
    }
}

void merge(std::vector<int>& arr, int l, int m, int r) {
    int len1 = m - l + 1, len2 = r - m;
    std::vector<int> left(len1), right(len2);
    for (int i = 0; i < len1; i++)
        left[i] = arr[l + i];
    for (int i = 0; i < len2; i++)
        right[i] = arr[m + 1 + i];

    int i = 0, j = 0, k = l;

    while (i < len1 && j < len2) {
        if (left[i] <= right[j]) {
            arr[k] = left[i];
            i++;
        } else {
            arr[k] = right[j];
            j++;
        }
        k++;
    }

    while (i < len1) {
        arr[k] = left[i];
        k++;
        i++;
    }

    while (j < len2) {
        arr[k] = right[j];
        k++;
        j++;
    }
}

void timSort(std::vector<int>& arr, int n) {
    for (int i = 0; i < n; i += RUN)
        insertionSort(arr, i, std::min((i + RUN - 1), (n - 1)));

    for (int size = RUN; size < n; size = 2 * size) {
        for (int left = 0; left < n; left += 2 * size) {
            int mid = left + size - 1;
            int right = std::min((left + 2 * size - 1), (n - 1));

            merge(arr, left, mid, right);
        }
    }
}

int main() {
    std::vector<int> arr = {5, 21, 7, 23, 19, 17, 5, 3, 11, 2};
    int length = arr.size();

    std::cout << "Given array is: ";
    for (int i : arr)
        std::cout << i << " ";
    std::cout << std::endl;

    timSort(arr, length);

    std::cout << "Sorted array: ";
    for (int i : arr)
        std::cout << i << " ";
    std::cout << std::endl;

    return 0;
}

性能考慮
當我們在AI領域中選擇排序演算法時,性能是一個主要的考慮因素。Tim排序法,與其它的排序演算法相比,通常在平均和最壞情況下都有較好的性能。其時間複雜度為https://chart.googleapis.com/chart?cht=tx&amp;chl=O(n%20%5Clog%20n)

然而,Tim排序法的真正優勢在於它處理已部分排序的資料時的效率。它能夠辨認已經排序的序列並利用它們,這使得它在這些情況下運行得更快。在AI的實際應用中,數據經常會有某種預期的順序或模式,因此使用Tim排序法可能會比其它的排序方法更加高效。

然而,像所有的技術選擇一樣,最好基於具體的需求和環境來選擇排序演算法。例如,當記憶體使用是一個問題時,我們可能會選擇一個較為記憶體高效的排序方法。不過,對於需要速度和穩定性的應用,Tim排序法絕對是值得考慮的選擇。

在AI中的應用
Tim排序法,由於其效率和穩定性,通常用於實時應用和大型數據集。在AI領域,當需要快速和穩定的排序方法時,Tim排序法是一個理想的選擇,特別是當資料已部分排序時。


上一篇
排序演算法 : 合併排序法
下一篇
搜尋演算法簡介
系列文
C++ AI 起步:編程進入智能世界32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言