---
# System prepended metadata

title: Non Comparison Sort 結報
tags: [Algorithm_Lab]

---

<style>
    html, body, .ui-content {
    background: #222222;
    color: #00BFFF;
}
::-webkit-scrollbar {
    width: 10px;
}
::-webkit-scrollbar-track {
    background: transparent;
}
::-webkit-scrollbar-thumb {
    background: linear-gradient(180deg, #2BE8CF60 0%, #2B83E860 100%);
    border-radius: 3px;
}
::-webkit-scrollbar-thumb:hover {
    background: linear-gradient(180deg, #2BE8CF95 0%, #2B83E895 100%);
}
    /* 設定 code 模板 */
   .markdown-body:not(.next-editor) pre {
    padding: 16px;
    background-color: #404040;
}
    .markdown-body code,
.markdown-body tt {
    background-color: #ffffff36;
}
.markdown-body .highlight pre,
.markdown-body pre {
    color: #ddd;
    background-color: #00000080;
}
.token.operator {
  background-color: transparent;
} 

   
</style>
###### tags: `Algorithm_Lab`

# Non Comparison Sort 結報
## OJ AC截圖
![](https://i.imgur.com/3iV2ocz.png)
## Code
```cpp=
#include <bits/stdc++.h>
#define dataRange 101
using namespace std;

inline void countingSort(vector<int> &nums, int exp, int radix) {
    vector<int> count(radix, 0), result(nums.size());
    for (auto &num : nums)
        ++count[(num / exp) % radix];
    for (int i = 1; i < radix; ++i) {
        count[i] = count[i] + count[i - 1];
    }
    for (int i = nums.size() - 1; i >= 0; --i) {
        count[(nums[i] / exp) % radix]--;
        result[count[(nums[i] / exp) % radix]] = nums[i];
    }
    for (int i = 0; i < nums.size(); ++i) {
        nums[i] = result[i];
    }
    return;
}
void RadixSort(vector<int> &nums, int radix) {
    int exp = 1, Max = INT_MIN;
    for (auto &num : nums)
        Max = max(num, Max);
    while (Max / exp > 0) {
        countingSort(nums, exp, radix);
        exp *= radix;
    }
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n;
    while (cin >> n && n != 0) {
        vector<int> nums(n);
        for (int i = 0; i < n; ++i)
            cin >> nums[i];

        RadixSort(nums, 20);
        for (int i = 0; i < n - 1; ++i)
            cout << nums[i] << " ";
        cout << nums.back() << endl;
    }
}
```
### $Assume$ $nums' size = n, radix = r, d = ceil(\log_r maxElement) + 1$
## 空間複雜度分析

1. 變數：i(6), exp, Max, num, n
2. 陣列：count \(r\), result(n)
total: r + n + 10
**O(n + r)**

## 時間複雜度分析

### Best Case && Worst Case
* RadixSort 找最大值(n)，while迴圈(d)
* CountintSort 計算數字出現次數(n)，計算答案位置\(r\)，放入result(n)，複製回nums(n)
* = n + d * (4 * n + r)
* **O(d * (n + r))**

## DATE

2023/03/14