---
# System prepended metadata

title: 氣泡排序bubble sort/內建sort
tags: [初階班]

---

# 氣泡排序bubble sort/內建sort

## infro
$sort$就是一種把一串資料以固定的排序方式排列的一種驗算法
例如：
把1,4,5,2,9,0,3依照非嚴格遞增的方式排列
$\implies$ 0,1,2,3,4,5,9
或是照字典序排列等等

## 氣泡排序法/bubble sort
### 演算法概念
氣泡排序法又稱交換排序法
現在有一個項數為$n$的數列$a_1,a_2....a_n$
從第一項開始，把$a_i$和$a_{i+1}$比較
並且把大的放到i+1項
直到第$a_{n-1}$和$a_{n}$
這樣我們就可以確定$a_n$是正確的
接下來從第一項開始比較直到$a_{n-2}$和$a_{n-1}$

 ![](https://i.imgur.com/IsClF0t.png)
> bubble sort 舞蹈影片 https://youtu.be/Iv3vgjM8Pv4
> wiki bubble sort gif https://upload.wikimedia.org/wikipedia/commons/0/06/Bubble-sort.gif
:::info
:::spoiler 進階內容
第1輪比較n-1次
第2輪比較n-2次
.
.
第n-1輪比較1次
$(n-1) + (n-2) + .... + 1 = n(n-1) / 2$

時間複雜度$O(n^2)$
:::

### 實作
```cpp=
#include<bits/stdc++.h>
using namespace std;

int main(){
    int n = 10;
    int arr[n];
    for(int i = 0; i < n; i++)cin >> arr[i];

    for(int i = n; i > 0; i--){
        for(int j = 0; j < i - 1; j++){
            if(arr[j] > arr[j + 1])swap(arr[j], arr[j + 1]);
        }
    }
    for(int i = 0; i < n; i++)cout << arr[i] << ' ';
}
```

## 內建sort
在$algorithm$這個標頭檔裡有內建好的排序法
且運行速度非常高，使用也方便
### 語法
```cpp=
sort(arr, arr + n);
```
:::info
:::spoiler 進階內容
內建sort是用heap sort家quick sort建構的，時間複雜度是$O(nlogn)$


sort()內是放記憶體位置
,前是起始值得記憶體位置
,後是終點值下一個的記憶體位置

一樣的原理也可以用在其他的各種STL中，例如
vector $\implies$ sort(vc.begin(),vc.end());

也可以幫自己建的struct,class排序
也可以自訂比較函式調整排序的方式
>>[自訂比較函式](/0T-V0gkzRCmM0qVQ6JM5Yw)
:::