fork(3) download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. //Bài này nếu dùng mảng đánh dấu, tôi sẽ đạt đc độ phức tạp yêu cầu là 3n
  5. //Đối với những bài toán sắp xếp, nếu giá trị các phần tử trong mảng không quá cao(phải là số lớn hơn 0), mà số lượng
  6. //các phần tử lớn, bản thân mình thấy dùng mảng đánh dấu là NO.1 :), ý kiến cá nhân thôi
  7.  
  8. int main() {
  9.  
  10. //Khai báo mảng a, khai báo cứng cho nhanh, mảng a có 10 phần tử
  11. int a[10] = {11, 1, 6, 3, 5, 2, 7, 9, 8, 4};
  12.  
  13. //Khai báo mảng đánh dấu( độ dài mảng = max(a[i]), nghĩa là bằng với giá trị
  14. //cao nhất của 1 phần tử nào đó trong mảng n. Khai báo mảng b và khởi tạo mọi
  15. //giá trị trong mảng = 0
  16. int b[10000+1] = {};
  17.  
  18. //Chạy 1 vòng lặp mất O(n) để đánh dấu
  19. for(int i = 0; i < 10; i++){
  20. b[a[i]]++;
  21. }
  22.  
  23. //Chạy vòng lặp mất m + n để lưu lại giá trị vào mảng a
  24. //Ở đây m < n rất nhiều, nên tổng chi phí 2 vòng for trên chưa vượt quá 3n.
  25. //Dùng mẹo đơn giản :)
  26. int dem = 0;
  27. for(int j = 0; j <= 10000; j++){
  28. while(b[j] > 0){
  29. a[dem] = j;
  30. b[j]--;
  31. dem++;
  32. }
  33. }
  34.  
  35. //In lại để kiểm tra mảng đã sắp xếp
  36. for(int i = 0; i < 10; i++){
  37. cout << a[i] << " ";
  38. }
  39.  
  40. return 0;
  41. }
Success #stdin #stdout 0s 2740KB
stdin
Standard input is empty
stdout
1 2 3 4 5 6 7 8 9 11