Sắp xếp trộn

Sắp xếp trộn

Sắp xếp trộn (merge sort) sẽ chia mảng ra thành hai phần trái và phải được sắp xếp rồi trộn vào với nhau. Sắp xếp trộn chạy trong thời gian là O(n * log(n)).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
 * @param arr là array
 * @param left là index ở phía bên trái tính từ 0
 * @param mid là index ở giữa trái tính từ 0
 * @param right là index ở phía bên trái tính từ 0, luôn < độ lớn của arr
 */
void merge(int* arr, int left, int mid, int right) {
  int tmp[right - left + 1];
  int i = left, j = mid + 1, pos = 0;
  while (i <= mid || j <= right) {
    if ((i <= mid && j <= right && arr[i] < arr[j]) || j > right) {
      tmp[pos++] = arr[i++];
    } else {
      tmp[pos++] = arr[j++];
    }
  }
  for (i = 0; i < right - left + 1; i++) {
    arr[left + i] = tmp[i];
  }
}

/**
 * @param arr là array
 * @param left là index ở phía bên trái tính từ 0
 * @param right là index ở phía bên trái tính từ 0, luôn < độ lớn của arr
 */
void mergeSort(int* arr, int left, int right) {
  if (left < right) {
    int mid = (left + right) / 2;
    mergeSort(arr, left, mid);
    mergeSort(arr, mid + 1, right);
    merge(arr, left, mid, right);
  }
}
Thuật toán có một nhược điểm là tạo thêm nhiều bộ nhớ khởi tạo thêm để làm mảng tạm thời lúc trộn.