๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • Welcome.
:: C_ ๐Ÿšฉ/์•Œ๊ณ ๋ฆฌ์ฆ˜

[์ž๋ฃŒ๊ตฌ์กฐ] by C์–ธ์–ด -05- [Merge Sort, Quick Sort]

by EunBird 2021. 3. 27.

ํ•ฉ๋ณ‘ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Merge Sort):

 

์ •๋ ฌํ•  ๋ฐฐ์—ด์„ ๋” ์ด์ƒ ๋‚˜๋ˆ ์งˆ ์ˆ˜ ์—†๋Š” ๋ฐฐ์—ด๋กœ ๋‚˜๋ˆ„์–ด(Divide) ๋ฐฐ์—ด ๋‹จ์œ„๋ณ„๋กœ ์ •๋ ฌ(Conquer)ํ•ด ๋‚˜๊ฐ€๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜.

 

์‹œ๊ฐ„ ๋ณต์žก๋„ : O(n log n)

 

ใ…กใ…กใ…กใ…กใ…ก

#include <stdio.h>

#define MAX 8
int tmp[MAX];
void merge(int list[], int left, int mid, int right) {
   int l_idx, r_idx, c_idx, t_idx;
   // l_idx : ์™ผ์ชฝ ๋ฐฐ์—ด์˜ ์ปค์„œ
   // r_idx : ์˜ค๋ฅธ์ชฝ ๋ฐฐ์—ด์˜ ์ปค์„œ 
   // c_idx : ์ž‘์€์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ€์•ผํ•˜๋Š” ๋ฐฐ์—ด์˜ ํ˜„์žฌ ์œ„์น˜
   // t_idx : ๋‚จ์€ ์›์†Œ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ž„์‹œ ์ธ๋ฑ์Šค

   l_idx = c_idx = left;
   r_idx = mid + 1;

   while (l_idx <= mid && r_idx <= right)
// l_idx <= 3 && r_idx <= 7
if (list[l_idx] <= list[r_idx])
         tmp[c_idx++] = list[l_idx++];
else
         tmp[c_idx++] = list[r_idx++];



   if (l_idx>mid) {
      for (t_idx = r_idx; t_idx <= right; t_idx++)
         tmp[c_idx++] = list[t_idx];
   }
   else {
      for (t_idx = l_idx; t_idx <= mid; t_idx++)   // (t_idx = 2; t_idx <= 3; t_idx++)
         tmp[c_idx++] = list[t_idx];
   }

// ๋ณต์‚ฌ๋ณธ์˜ ๋‚ด์šฉ์„ ์›๋ณธ์— ๋ณต์‚ฌ
   for (t_idx = left; t_idx <= right; t_idx++) {
      list[t_idx] = tmp[t_idx];
   }

   printf("SORTED : ");
   l_idx = -1;
   while (tmp[++l_idx] != 0) {
      printf("%d ", tmp[l_idx]);
   }
   printf("\n");
}


void merge_sort(int list[], int left, int right) {
   int mid;

   if (left == right) { 
// ํ˜„์žฌ ๋ด์•ผํ•˜๋Š” ๋ฐฐ์—ด์ด ์›์†Œ๊ฐ€ 1๊ฐœ๋ฟ์ธ ๋ฐฐ์—ด์ด๋‹ˆ? 
   return;
   }
   mid = (left + right) / 2;
// ๊ฐ€์šด๋ฐ ์ธ๋ฑ์Šค๋ฅผ ๊ตฌํ•จ
   merge_sort(list, left, mid); 
// divide (left ~ mid)
   merge_sort(list, mid + 1, right);
 // divide( mid +1 ~ right )
   merge(list, left, mid, right);
 // conquer
}

int main() {
   int arr[MAX] = { 7, 8, 5, 4, 6, 1, 3, 2 };

   printf("Given array is \n");
//์ฒ˜์Œ์˜ ์ˆซ์ž ๋ฐฐ์—ด ์ถœ๋ ฅ.
   for (int i = 0; i < MAX; ++i) {
      printf("%d ", arr[i]);
   }
   printf("\n");

   merge_sort(arr, 0, MAX - 1);
// merge sort ํ˜ธ์ถœ.-> ์žฌ๊ท€ํ•จ์ˆ˜ ์‹œ์ž‘.

   printf("\nSorted array is \n"); // sort์ฒ˜๋ฆฌ๋œ ์ˆซ์ž์—ด ์ถœ๋ ฅ.
    for (int i = 0; i < MAX; ++i) {
      printf("%d ", arr[i]);
   }
   printf("\n");
   return 0;
}

ใ…กใ…กใ…กใ…กใ…ก

 

728x90

๋Œ“๊ธ€