Trong chương III của cuốn TLCT1 có nói về thuật toán sắp xếp đếm bằng phân phối (Distribution Counting) như sau:
Mình tiến hành cài đặt thuật toán như sau:
Code: https://ideone.com/FriBIt
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void DisCountSort(vector<int> &arr, int n)
{
auto _max = max_element(arr.begin(), arr.end());
int max_val = *_max;
arr.clear(); // begin to sort arr
vector<int> c(max_val + 1, 0); // number of times that index value appears
for (int i = 0; i < n; ++i) c[arr[i]] += 1;
auto it = arr.begin();
for (int i = 0; i < max_val + 1; ++i) {
if (c[i] > 0) {
arr.insert(it, c[i], i);
it = arr.end();
}
}
}
int main()
{
vector<int> arr{30, 90, 60, 70, 10, 60, 30, 70, 100, 50, 70};
DisCountSort(arr, arr.size());
for (auto &it : arr) cout << it << " ";
return 0;
}
Cho mình hỏi là cách cài đặt của mình có đảm bảo độ phức tạp O(max(N, K)) của thuật toán trên lý thuyết ko ạ? Nếu không thì cho mình hỏi những cho cần cải tiến?
Xin cảm ơn!
P/S: Trong trường hợp này std::insert của vector là O(1) đúng không ạ? (vì nó được đặt trong vòng for O(K) mà nếu ko phải O(1) thì đpt khác với đpt yêu cầu ban đầu của thuật toán?)