개인 자료란 (JE)

  서버 커뮤니티

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

질문하기 C

c언어 힙정렬 질문..

2020.02.17 조회 수 161 추천 수 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/115/774/003/262x150.crop.jpg?20240424234825

업데이트

마인크래프트 1.20.5 정식 업데이트

학교가기싫다

2024-04-24

0

/files/thumbnails/762/770/003/262x150.crop.jpg?20240418073724

레드스톤

T.B.H (고민중독) | 노트블럭 버전 | NoteBlock Cover [한국어 영어 중국어 가사 추가]

노트블럭전문가

2024-04-18

0

/files/thumbnails/218/767/003/262x150.crop.jpg?20240412130213

레드스톤

우리의 꿈 - 원피스 오프닝

노트블럭전문가

2024-04-12

0

/files/thumbnails/505/766/003/262x150.crop.jpg?20240411122306

레드스톤

기동전사 건담 수성의 마녀 | 노트블럭 커버 1

노트블럭전문가

2024-04-11

1

/files/thumbnails/932/765/003/262x150.crop.jpg?20240410124459

레드스톤

마인크래프트 노트블록으로 만든 『 밤양갱 (Bam Yang Gang) 』

노트블럭전문가

2024-04-10

0