C++ 小社

排序演算法

講師:蘇西

排序 Sort

就是把東西依照特定順序排列

有講跟沒講一樣欸

時間複雜度 Time complexity

氣泡排序法

Bubble sort

排序過程中較大的元素會像水中的氣泡一樣,透過不斷地與相鄰元素比較和交換,慢慢地、一個一個「浮」到數列的末端(頂端),所以叫做氣泡排序法

1

5

3

9

7

排序過程中較大的元素會像水中的氣泡一樣,透過不斷地與相鄰元素比較和交換,慢慢地、一個一個「浮」到數列的末端(頂端),所以叫做氣泡排序法

1

5

3

9

7

排序過程中較大的元素會像水中的氣泡一樣,透過不斷地與相鄰元素比較和交換,慢慢地、一個一個「浮」到數列的末端(頂端),所以叫做氣泡排序法

1

5

3

9

7

排序過程中較大的元素會像水中的氣泡一樣,透過不斷地與相鄰元素比較和交換,慢慢地、一個一個「浮」到數列的末端(頂端),所以叫做氣泡排序法

1

5

3

7

9

排序過程中較大的元素會像水中的氣泡一樣,透過不斷地與相鄰元素比較和交換,慢慢地、一個一個「浮」到數列的末端(頂端),所以叫做氣泡排序法

1

5

3

7

9

排序過程中較大的元素會像水中的氣泡一樣,透過不斷地與相鄰元素比較和交換,慢慢地、一個一個「浮」到數列的末端(頂端),所以叫做氣泡排序法

1

5

3

7

9

排序過程中較大的元素會像水中的氣泡一樣,透過不斷地與相鄰元素比較和交換,慢慢地、一個一個「浮」到數列的末端(頂端),所以叫做氣泡排序法

1

5

3

7

9

排序過程中較大的元素會像水中的氣泡一樣,透過不斷地與相鄰元素比較和交換,慢慢地、一個一個「浮」到數列的末端(頂端),所以叫做氣泡排序法

1

5

3

7

9

排序過程中較大的元素會像水中的氣泡一樣,透過不斷地與相鄰元素比較和交換,慢慢地、一個一個「浮」到數列的末端(頂端),所以叫做氣泡排序法

1

5

3

7

9

排序過程中較大的元素會像水中的氣泡一樣,透過不斷地與相鄰元素比較和交換,慢慢地、一個一個「浮」到數列的末端(頂端),所以叫做氣泡排序法

1

5

3

7

9

最佳情況 O (n)
最壞情況 O (n^2)
void bubbleSort(vector<int>& arr) {
    int n = arr.size();
    for (int i = 0; i < n - 1; ++i) {
        // 內層進行兩兩相鄰元素比較與交換
        for (int j = 0; j < n - 1 - i; ++j) {
            if (arr[j] > arr[j + 1]) {
                swap(arr[j], arr[j + 1]);
            }
        }
    }
}

選擇排序法

Selection Sort

非常直覺,就是每次都抽出原序列裡面最小的數,

依抽出來的順序進行排列

1

2

3

5

7

非常直覺,就是每次都抽出原序列裡面最小的數,

依抽出來的順序進行排列

1

2

3

5

7

非常直覺,就是每次都抽出原序列裡面最小的數,

依抽出來的順序進行排列

1

2

3

5

7

非常直覺,就是每次都抽出原序列裡面最小的數,

依抽出來的順序進行排列

1

2

3

5

7

非常直覺,就是每次都抽出原序列裡面最小的數,

依抽出來的順序進行排列

1

2

3

5

7

非常直覺,就是每次都抽出原序列裡面最小的數,

依抽出來的順序進行排列

1

2

3

5

7

最佳情況 O (n)
最壞情況 O (n^2)
void selectionSort(vector<int>& arr) {
    int n = arr.size();
    // 每次選擇最小值放到前面
    for (int i = 0; i < n - 1; ++i) {
        int minIndex = i; // 假設目前最小值位置
        for (int j = i + 1; j < n; ++j) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        // 將找到的最小值放到正確位置
        swap(arr[i], arr[minIndex]);
    }
}

插入排序法

Insertion Sort

往左到右檢查每個數值是不是在正確的位置

如果不是,就把它插入到正確的位置

1

2

3

5

7

往左到右檢查每個數值是不是在正確的位置

如果不是,就把它插入到正確的位置

1

2

3

5

7

往左到右檢查每個數值是不是在正確的位置

如果不是,就把它插入到正確的位置

1

2

3

5

7

最佳情況 O (n)
最壞情況 O (n^2)
void insertionSort(vector<int>& arr) {
    int n = arr.size();
    for (int i = 1; i < n; ++i) {
        int key = arr[i]; // 待插入的元素
        int j = i - 1;
        // 將比 key 大的元素往右移
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j--;
        }
        // 將 key 插入正確位置
        arr[j + 1] = key;
    }
}

合併排序法

 Merge Sort

時間複雜度 O (nlogn)
每回合的合併需要花:O(n)
總共需要回合數:O(log n)

STL Sort

array

#include <algorithm>
sort(ary+0, ary+n);
less<Type>:小於,i+1小於i的就交換swap(升序)
less_equal<Type>:小於等於,i+1小於等於i的就交換swap(升序)
greater<Type>:大於,i+1大於i的就交換swap(降序)
greater_equal<Type>:大於等於,i+1大於等於i的就交換swap(降序)

array

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std; 

bool mycompare(int a, int b) {
    return a > b; // Descending order
}

int main() {
    int arr[] = {5, 4, 1, 7, 3, 8, 9, 10, 6, 2};
    
    // std::vector -> vector
    vector<int> v(arr, arr + 10);
    
    // std::sort -> sort
    sort(v.begin(), v.end(), mycompare);
    
    // std::cout -> cout, std::endl -> endl
    cout << "sort vector by function (decreasing):" << endl;
    for (int i : v) {
        cout << i << " ";
    }
    cout << endl;

    return 0;
}

C++ 小社

By Suzy Huang

C++ 小社

  • 16