개인 자료란 (JE)

  서버 커뮤니티

Profile 배고픈상어-효묘 대표칭호 없음
Profile

질문하기 C

c언어 힙정렬 질문..

2020.02.17 조회 수 162 추천 수 0
이해도 기타 

백준 2751번. 시간복잡도가 O(n*log(n)) 정렬을 쓰랍니다. 힙정렬이 nlogn이라길래 알고리즘 구현해봤는데  시간 초과가 뜨네요.. 뭔가 쓸때없는 연산을 했다는건데 어디가 잘못될 걸까요?

#define _CRT_SECURE_NO_WARNINGS#include <iostream>using namespace std;#define FOR(i, n) for(int i = 0 ; i < n ; i++)void heapSort(int *arr, int lo, int hi);void hSort(int *arr, int root, int hi);void downHeap(int *arr, int hi, int root, int c);int partialSort(int *arr, int root, int hi);int main() {	srand((unsigned)time(NULL));	int n;	int *arr=NULL;	cin >> n;	arr = (int*)calloc(n, sizeof(*arr));	FOR(i, n) {		int k;		cin >> k;		arr[i] = k;	}cout << endl;	heapSort(arr, 0, n - 1);	FOR(i, n) {		cout << arr[i] << "\n";	}	return 0;}void heapSort(int *arr, int lo, int hi) {	int last = hi;	while (last > 0) {		hSort(arr, lo, last);		int tmp = arr[lo];		arr[lo] = arr[last];		arr[last] = tmp;		--last;	}}void hSort(int *arr, int root, int hi) {	int r = root;	int c1 = r * 2 + 1;	int c2 = r * 2 + 2;	//maxHeap 한 번만	//downHeap	if (r <= hi && c1 <= hi) {		hSort(arr, c1, hi);		hSort(arr, c2, hi);		int c = partialSort(arr, r, hi);		//왼쪽 자식과 바꾸면 c = 1, 우측 자식과 바꾸면 c = 2, outOfIndexRange이거나 안 바꾸면 c = 0		//c값에 따라서 donwHeap을 하는 것임		downHeap(arr, hi, r, c);	}}void downHeap(int *arr, int hi, int root, int c) {	if (c == 0)return;	int r = root;	int c1 = r * 2 + 1;	int c2 = r * 2 + 2;	if (c == 1 && c1<=hi) {		int k = partialSort(arr, c1, hi);		downHeap(arr, hi, c1, k);	}	else if(c==2 && c2<=hi){		int k = partialSort(arr, c2, hi);		downHeap(arr, hi, c2, k);	}}int partialSort(int *arr, int root, int hi) {	int r = root;	int c1 = r * 2 + 1;	int c2 = r * 2 + 2;	//	if (c2 > hi) {		if (c1 > hi) {			return 0;		}else {			if (arr[c1] > arr[r]) {				int tmp = arr[r];				arr[r] = arr[c1];				arr[c1] = tmp;				return 1;			}			else {				return 0;			}		}	}	if (arr[c1] > arr[c2]) {		if (arr[c1] > arr[r]) {			int tmp = arr[r];			arr[r] = arr[c1];			arr[c1] = tmp;			return 1;		}	}else if (arr[c2] > arr[r]) {		int tmp = arr[r];		arr[r] = arr[c2];		arr[c2] = tmp;		return 2;	}	return 0;}



2개의 댓글

camelCase
2020.02.17

저라면 저거 코드 한줄한줄 읽기보다는 간단한 테스트 로직 짜서 IDE로 돌려볼것 같네요.

본인 컴퓨터에서 테스트 한번 해보세요

디버깅은 바텀업이아니라 탑다운으로 하는게 편합니다

@camelCase

작동은 합니다! 다만 시간초과가 걸릴뿐..ㅠ

뉴스 및 창작물
/files/thumbnails/268/789/003/262x150.crop.jpg?20240515192032

레드스톤

벌레먹은 돌 빠르게 제거하는 법

GlassesFilm

2024-05-15

0

/files/thumbnails/797/788/003/262x150.crop.jpg?20240515090924

건축

마인크래프트로 구현한 카르카손 보드게임

Warak

2024-05-15

1

/files/thumbnails/487/784/003/262x150.crop.jpg?20240508233607

모드

Windows Borderless 모드에서 악성코드 발견 2

학교가기싫다

2024-05-08

1

/files/thumbnails/384/778/003/262x150.crop.jpg?20240512002324

업데이트

마인크래프트 자바 에디션 스냅샷 24w18a

학교가기싫다

2024-05-06

0

/files/thumbnails/855/781/003/262x150.crop.jpg?20240505141129

레드스톤

레이저 클리너

GlassesFilm

2024-05-05

1