fork download
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define MAX_n 1000000
  4.  
  5. int temp[MAX_n];
  6. int a[MAX_n];
  7.  
  8. void merge_sort(int a[MAX_n], int left, int right) {
  9.  
  10. if(left >= right) return;//Khi dãy được xét chỉ có tối đa 1 phần tử, bỏ qua
  11.  
  12. int mid = (left + right) / 2;//Lấy biến mid làm mốc để chia đôi dãy
  13.  
  14. //Lần lượt sắp xếp 2 nửa trái - phải của dãy to
  15. merge_sort(a, left, mid);
  16. merge_sort(a, mid + 1, right);
  17.  
  18. int i = left, j = mid + 1;//Lưu vị trí của phần tử đang xét trong 2 dãy con
  19. int curr = 0;//Lưu ô trống muốn đưa vào dãy temp
  20. while((i <= mid) || (j <= right)) {/*Dừng lại khi i > mid VÀ j > right, tức là
  21. cả 2 dãy không còn phần tử nào cần sắp xếp*/
  22. if(i > mid) {//Nếu dãy trái không còn phần tử, đưa phần tử của dãy phải vào
  23. temp[curr] = a[j];
  24. curr++;
  25. j++;
  26. } else if (j > right){//Tương tự, nếu dãy phải không còn phần tử,...
  27. temp[curr] = a[i];
  28. curr++;
  29. i++;
  30. } else if(a[i] < a[j]) {/*Khi cả 2 dãy còn phần tử, nếu phần tử đang xét
  31. của dãy trái nhỏ hơn phần tử của dãy phải,...*/
  32. temp[curr] = a[i];
  33. curr++;
  34. i++;
  35. } else {//Nếu phần tử đang xét của dãy phải nhỏ hơn...
  36. temp[curr] = a[j];
  37. curr++;
  38. j++;
  39. }
  40. }
  41. //Đưa các phần tử đã được sắp xếp trong dãy temp về đúng vị trí trong dãy a
  42. for(int i = 0; i < curr; i++) a[left + i] = temp[i];
  43. }
  44.  
  45.  
  46. int main() {
  47. int n;
  48. cin >> n;
  49. for(int i = 0; i < n; i++) cin >> a[i];
  50.  
  51. // S?p x?p g?p - Merge Sort
  52. merge_sort(a, 0, n - 1);
  53.  
  54. for(int i = 0; i < n; i++) cout << a[i] << " ";
  55. }
Success #stdin #stdout 0s 5596KB
stdin
5
5 8 2 5 2
stdout
2 2 5 5 8