Quick sort
'์๊ณ ๋ฆฌ์ฆ' ์ ๊ณต ์์
์๊ฐ์ ๋์จ ๊ณผ์ ์ธ '1000๋ง๊ฐ ๋ฐ์ดํฐ ์ ๋ ฌ ํ ํด์ ๊ฐ ๊ตฌํ๊ธฐ'๋ฅผ ํ๋ฉด์ ์ ๋ฆฌํ ๋ด์ฉ์ด๋ค.
๋ถํ ์ ๋ณต ๋ฐฉ๋ฒ์ ํตํด ๊ตฌํ๋๋ ์ ๋ ฌ ๋ฐฉ๋ฒ
์๊ฐ ๋ณต์ก๋
์ต์ : O(n^2)
ํ๊ท : O(nlogn)
์ค๊ณ๋ฅผ ํตํด์ ๊ฐ์ ๊ฐ๋ฅํ ๋ถ๋ถ
๊ตฌํ ๊ณผ์
- pivot์ ์ ํํ๋ค.
- ์์ชฝ ํฌ์ธํฐ๊ฐ ๋ฎ์ ์ชฝ์ผ๋ก ๊ฐ๋ฉด์ ํผ๋ฒ๋ณด๋ค ์์ ์๋ฅผ ์ฐพ๋๋ค.
- ์๋์ชฝ ํฌ์ธํฐ๊ฐ ๋์ ์ชฝ์ผ๋ก ๊ฐ๋ฉด์ ํผ๋ฒ๋ณด๋ค ํฐ ์๋ฅผ ์ฐพ๋๋ค.
- ๋ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์์๋ฅผ ๊ตํํ๋ค.
- 2-4๋ฅผ ๋ฐ๋ณตํ๋ค.
- ๋ ํฌ์ธํฐ๊ฐ ๊ต์ฐจํ๋ค๋ฉด ํ์ฌ ํผ๋ฒ๊ณผ ํด๋น ์์น์ ๊ฐ์ ๊ตํํ๋ค.
- ํผ๋ฒ๊ณผ ํผ๋ฒ๋ณด๋ค ์์ section, ํผ๋ฒ๋ณด๋ค ํฐ section์ผ๋ก ๋๋๊ณ ๊ฐ section์ ๋ํด 1-5๋ฅผ ์คํํ๋ค.
- section์ ํฌ๊ธฐ๊ฐ 0 ๋๋ 1์ด๋ฉด ๊ทธ๋ฅ return ํ๋ค.
์ค๊ณ๋ฅผ ํตํ ๊ฐ์
pivot ์ ํ ๊ณผ์ ์์ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ์์๋ฅผ ๊ณ์ํด์ ์ ํํด ๋๊ฐ๋ค๋ฉด ์ญ์์ผ๋ก ๋ฐฐ์น๋์์ ๋, ์ต์ ์ ์๊ฐ๋ณต์ก๋๊ฐ ๋์ฌ ์ ์๋ค.
๋ฐ๋ผ์ ๊ธฐ์กด ์ฝ๋์์ ์ค๊ฐ ์์๋ฅผ ์ฒซ๋ฒ์งธ ์์์ ๊ตํํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํจ์ผ๋ก์จ ๊ฐ์ ํ ์ ์๋ค.
๋ค๋ฅธ nlogn๋ณด๋ค ๋น ๋ฅธ ์ด์
๋จผ ๊ฑฐ๋ฆฌ ๊ตํ ์ฒ๋ฆฌ์ ์บ์ ํจ์จ
์บ์ ํจ์จ : ํ ๋ฒ ์ ํ๋ ๊ธฐ์ค์ ์ ์ธ
์ ๋ ฌ๋ ๊ฐ์ ์ ์ธํ๊ณ ๋จ์ ๊ฐ๋ง ์ ๋ ฌํ๋ฉด ๋จ
๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ๊ฐ ์ง์ญํ๋์ด ์๊ธฐ ๋๋ฌธ์ CPU ์บ์์ ํํธ์จ์ด ๋์์ง๊ธฐ ๋๋ฌธ
๋ฉ๋ชจ๋ฆฌ
O(log n)๋งํผ์ ๋ฉ๋ชจ๋ฆฌ ํ์
๋ถ์์ ์ ๋ ฌ
์์๋ค ์ค์ ๊ฐ์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ๊ฐ์ ๊ฐ๋ค์ ์ ๋ ฌ ์ดํ ์์๊ฐ ์ด๊ธฐ ์์์ ๋ฌ๋ผ์ง ์ ์์ด ๋ถ์์ ์ ๋ ฌ์ ์ํ๋ค.
ํฐ ์๋ฅผ ๋ค๋ฃจ๋ ํต์ํธ ๊ตฌํ
/*
2020-03-26 ์ฐํฌ์
ํต์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
typedef struct _MY_OBJ {
int s, e;
}obj;
int buffer[10000000]; // ์ ์ญ ๋ณ์๋ก ๋ฃ์ด์ผ stack overflow๊ฐ ๋์ง ์์//
obj obj_arr[10000000];//
obj tmp_arr[10000000];//
int index = 0;
void fileOpen() {
FILE *fp = fopen("d://algorithm/unsorted10000000.txt", "r");//
int i = 0;
int tmp = 0;
if (fp == NULL) {
printf("ํ์ผ์ ์ด ์ ์์ต๋๋ค.\n");
}
while (fscanf(fp, "%d ", &tmp) != EOF) {
buffer[i++] = tmp;
}
fclose(fp);
}
/*
void swap(int a, int b) {
// swap์ ์ฐ๋ฉด stack over flow๊ฐ ๋์์ ๊ทธ๋ฅ ์ง์ ๋ฐ๊พธ๋ ์์ผ๋ก ๋ฐ๊พธ์๋ค.
int tmp = buffer[a];
buffer[a] = buffer[b];
buffer[b] = tmp;
}
*/
void QuickSorting(int left, int right) {
srand((unsigned int)time(NULL));
int pivot_index = rand() % 9999999 + 1; //
int tmp;
int start, end;
// ๋๋ค์ผ๋ก pickํ pivot ๊ฐ๊ณผ ์ฒซ๋ฒ์งธ ๊ฐ ๋ฐ๊พธ๊ธฐ
tmp = buffer[left];
buffer[left] = buffer[pivot_index];
buffer[pivot_index] = tmp;
obj_arr[index].s = left; obj_arr[index++].e = right;
do {
int size = index;
index = 0;
for (int i = 0; i < size; i++) {
left = obj_arr[i].s; right = obj_arr[i].e;
if (right - left < 4) { // ์ฝ์
์ ๋ ฌ์ด์ฉ
for (int j = left + 1; j < right + 1; j++) {
int key = buffer[j];
int k;
for (k = j - 1; k >= left && buffer[k] > key; k--) {
buffer[k + 1] = buffer[k];
}
buffer[k + 1] = key;
}
continue;
}
start = left; end = right + 1;
pivot_index = left + (right - left) / 2;
tmp = buffer[left];
buffer[left] = buffer[pivot_index];
buffer[pivot_index] = tmp;
do {
do {
start++;
} while (buffer[start] <= buffer[left] && left <= start);
do {
end--;
} while (buffer[end] > buffer[left] && right >= end);
if (start <= end) {
tmp = buffer[start];
buffer[start] = buffer[end];
buffer[end] = tmp;
}
else
break;
} while (1);
if (left != end) {
tmp = buffer[end];
buffer[end] = buffer[left];
buffer[left] = tmp;
}
if (end - 1 - left>0) {
tmp_arr[index].s = left; tmp_arr[index++].e = end - 1;
}
if (right - end - 1>0) {
tmp_arr[index].s = end + 1; tmp_arr[index++].e = right;
}
}
for (int i = 0; i < index; i++) {
obj_arr[i] = tmp_arr[i];
}
} while (index);
}
int calHash(int index_start, int index_end) {
int sum = 0;
for (int i = index_start; i < index_end + 1; i++) {
sum += buffer[i] - (int)((int)(buffer[i] * pow(10, -5)) * pow(10, 5));
}
sum -= (int)((int)(sum * pow(10, -5)) * pow(10, 5));
return sum;
}
int main() {
printf("์๊ณ ๋ฆฌ์ฆ ๊ณผ์ 2\n");
printf(" ์ปดํจํฐ๊ณผํ๋ถ 2017920038 ์ฐํฌ์\n");
printf("ใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
ก\n");
clock_t start, end;
int n = 10000000; // ๊ณ์ฐํ ์์ ๋ฒ์//
/* ํ์ผ ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ */
fileOpen();
/* ์๊ฐ ์ธก์ */
start = clock(NULL);
printf("- ์ปดํจํฐ CPU : Intel(R) Core(TM) i7-7500U CPU @ 2.70Ghz \n");
printf("- ๋ฉ๋ชจ๋ฆฌ : 8GB\n");
/* ์ฝ์
์ ๋ ฌ */
QuickSorting(0, n - 1);
end = clock(NULL);
printf("- ๋์์๊ฐ: %lfms\n", (double)(end - start));
/* hash ๊ณ์ฐ */
printf("- hash value: %d\n", calHash(4999999, 5000099));//4999999, 5000099
return 0;
}
์ฌ๊ท ํจ์ ์คํ ์ stackoverflow ์ด๋ฏ๋ก obj ๊ตฌ์กฐ์ฒด์ ๋ฐฐ์ด์ ํ๋ ๋ง๋ค์ด ์คํ์ฒ๋ผ ๊ตฌํํ๊ฒ ํ์๊ณ , swap ํจ์๋ stackoverflow๋ฅผ ์ผ์ผํค๋ฏ๋ก ์ผ์ผ์ด ๋ค ํ์ด์ ์จ์ฃผ์๋ค.
์ฝ์ ์ ๋ ฌ๊ณผ์ ๋น๊ต
์ฝ์ ์ ๋ ฌ : 15097000ms (251๋ถ)
ํต ์ ๋ ฌ : 1016ms (1์ด)
๋ฌด๋ ค 1500๋ฐฐ ์ฐจ์ด์๋ค.
์ปดํจํฐ ์ฌ์
์ปดํจํฐ CPU : Intel(R) Core(TM) i7-7500U CPU @ 2.70Ghz
๋ฉ๋ชจ๋ฆฌ : 8GB
Comment