C언어 알고리즘 정리 및 실무 프로젝트

C언어의 선택정렬, 버블정렬, 삽입정렬, 셸 정렬 알고리즘 (Call by Reference 포인터 기능) 본문

C언어 알고리즘

C언어의 선택정렬, 버블정렬, 삽입정렬, 셸 정렬 알고리즘 (Call by Reference 포인터 기능)

C's everything! 2022. 4. 20. 16:27
반응형

사용자 지정 함수 사용 절차:    1. 사용자 지정 헤더 파일( ex: function.h )을 새로 생성합니다.

                                                      2. 생성된 헤더파일에 아래의 코드를 붙여넣습니다.

                                                      3. main()가 있는 소스에 헤더파일을 포함시킵니다. ( ex: #include " function.h") 

안정정렬: 중복된 값이 있을 때, 원본순서와 동일하게 정렬되는 방식        ex) 버블정렬, 삽입정렬

불안정정렬: 중복된 값이 있을 때, 원본순서와 동일하지 않게 정렬되는 방식         ex) 선택정렬, 셸정렬

void bubble_p(int num[], int size)		// 버블 정렬
{
	// 첫 번째 매개변수: 배열의 이름(시작 주소)
	// 두 번째 매개변수: 배열의 크기

	int temp;

	for (int i = 0; i < size - 1; i++) {

		for (int k = 1; k < size - i; k++) {
			if (*(num + k - 1) > *(num + k))		// 오른쪽이 더 작으면 바꿈.(오름차순)
			{
				temp = *(num + k);
				*(num + k) = *(num + k - 1);
				*(num + k - 1) = temp;
			}
		}
	}
}

void insert_p(int num[], int size)		// 삽입 정렬
{
	int temp;

	for (int i = 1; i < size; i++) {		

		for (int k = 0; k < i; k++) {
			if (*(num + k) > *(num + i)) // i번째 요소에서 k번째 요소의 값들을 하나씩 비교하면서 정렬
			{				// i번째 요소가 더 작으면 자리를 바꿈. (오름차순)
				temp = *(num + k);
				*(num + k) = *(num + i);
				*(num + i) = temp;
			}
		}
	}
}

void select_p(int num[], int size)		// 선택 정렬
{
	int i = 0, j = 0;
	int temp;

	for (i = 0; i < size - 1; i++)
	{
		for (j = i + 1; j<size; j++)
		{
			if (*(num + i) > *(num + j))
				// 왼쪽의 값을 오른쪽의 값들과 계속 비교하는 방식										
			{
				temp = *(num + i);
				*(num + i) = *(num + j);
				*(num + j) = temp;
			}
		}
	}

}

void cell_p(int num[], int size)		// 셸 정렬 (삽입 정렬의 단점 보완)
{

	int temp;

	int interval = size / 2;	// 간격 초기값

	while (interval != 1) {		// 간격이 1이 될 때까지 반복 (정해진 간격만큼 떨어진 요소끼리 반복해서 정렬한다.)

		for (int i = 0; i <size - interval; i++) {		// 간격이 줄어들수록 많이 반복함.
			if (*(num + i) > *(num + interval + i))		// 오른쪽이 더 작으면 바꿈. (오름차순)
			{
				temp = *(num + interval + i);
				*(num + interval + i) = *(num+i);
				*(num + i) = temp;
			}
		}

		interval /= 2;

		if (interval % 2 == 0)	// 짝수면 ++	( 간격은 홀수인게 편리합니다.)
			interval++;
	}

	insert_p(num, size);	// 간격이 1이 된 이후에는 삽입 정렬을 수행한다.

}

 

반응형
Comments