iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0
自我挑戰組

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

排序演算法 : 謝耳排序法

  • 分享至 

  • xImage
  •  

謝耳排序(Shell Sort)是由Donald Shell於1959年提出的排序演算法,可以看作是插入排序的一種擴展。它首先將待排序的數列划分為多個子序列,然後對每一個子序列進行插入排序,隨著演算法的進行,子序列的間距會逐渐減少,最後當間距縮小到1時,整個數列形成一個近乎有序的狀態,此時再對整體進行插入排序。

謝耳排序法簡介
謝耳排序的核心思想是利用間距(也稱為增量)將數列分成子序列,然後對每個子序列進行插入排序。增量的選擇對演算法的效率至關重要。

#include <iostream>

void shellSort(int arr[], int n) {
    // 開始的間距設為 n/2,之後逐渐減少
    for (int gap = n/2; gap > 0; gap /= 2) {
        // 對所有間距為 gap 的元素進行插入排序
        for (int i = gap; i < n; i++) {
            int temp = arr[i];
            int j;
            for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {
                arr[j] = arr[j - gap];
            }
            arr[j] = temp;
        }
    }
}

int main() {
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(arr) / sizeof(arr[0]);

    shellSort(arr, n);

    std::cout << "Sorted array: ";
    for (int i = 0; i < n; i++) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

性能考慮
謝耳排序的時間複雜度取決於增量序列的選擇。對於上述示例中的增量序列,最壞情況的時間複雜度為https://chart.googleapis.com/chart?cht=tx&amp;chl=O(n%5E2) ,但更好的增量選擇可以達到https://chart.googleapis.com/chart?cht=tx&amp;chl=O(n%20%5Clog%20n) 的時間複雜度。

在AI中的應用
謝耳排序提供了一種基於插入排序的優化方法,其性能取決於增量的選擇。謝耳排序可能不是AI中數據排序的首選演算法,但認識它有助於深入理解如何優化基本的排序演算法。在數據前處理或特徵提取中,有效的排序是關鍵。


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

尚未有邦友留言

立即登入留言