공중과열새싹
Biomechanical engineering blog
정렬 - Bubble sort
728x90

Bubble sort

 

#include <stdio.h>
#include <stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
#define swap(type, x, y) do {type t = x; x = y; y = t;} while(0)

void bubble(int a[], int n)
{
	int i, j;
	for (i = 0; i < n - 1; i++)
	{
		for (j = n - 1; j > i; j--)
			if (a[j - 1] > a[j])			
				swap(int, a[j - 1], a[j]);			
	}
}

int main(void)
{
	int i, nx;
	int *x;
	puts("Bubble sort");
	printf("number of factors : ");
	scanf("%d", &nx);
	x = calloc(nx, sizeof(int));

	for (i = 0; i < nx; i++)
	{
		printf("x[%d] : ", i);
		scanf("%d", &x[i]);
	}

	bubble(x, nx);

	puts("Aligned in ascending order.");
	for (i = 0; i < nx; i++)
		printf("x[%d] = %d\n", i, x[i]);
	free(x);

	return 0;
}

 

 

상단의 코드에서 void bubble함수를 개선해 본다.

모든 사이클을 다 돌 필요가 없을 수도 있기에 만약 사이클을 돌 때 배열에서 swap이 한 번도 일어나지 않았다면 정렬을 멈추고 break문으로 빠져나오게 할 수 있다.

// 카운터 도입
void bubble(int a[], int n)
{
	int i, j;
	for (i = 0; i < n - 1; i++)
	{
		int exchg = 0;
		// 한 사이클 돌리는 for문
		for(j = n -1; j > i; j--)
			if (a[j - 1] > a[j])
			{
				swap(int, a[j - 1], a[j]);
				exchg++;
			}
		if (exchg == 0) break;
	}
}

 

 

더 나아가서 사이클을 도는 범위를 점차 좁혀갈 수도 있다.

void bubble(int a[], int n)
{
	int k = 0; // 마지막 swap이 이루어진 자리 저장 변수
	// swap해준 자리가 배열 마지막 자리와 같다면 while문 패스
	while (k < n - 1)
	{
		int j;
		int last = n - 1;
		for(j = n - 1; j > k; j--)
			// swap 판단
			if (a[j - 1] > a[j])
			{
				swap(int, a[j - 1]; a[j]);
				last = j; // swap 판단해준 자리 저장
			}
		k = last; // for바깥에서 또 마지막으로 swap된 자리 저장
	}
}

 

728x90

'어플리케이션 > 자료구조' 카테고리의 다른 글

문자열  (0) 2021.05.30
8-Queen recursion in c  (0) 2021.05.23
Queue in c  (0) 2021.05.21
Stack in c  (0) 2021.05.20
  Comments,     Trackbacks