버블 정렬법(bubble sort)은 제 1단계에서 처음 것을 인접한 그 다음 번 위치의 데이터와 비교하여 선택 정렬 때와 같은 요령으로 맞바꾸기한 후 그 중에서 뒤의 데이터와 다시 인접한 그 다음 번 데이터를 끝(n번째)까지 비교하여 가장 뒤에 위치할 데이터를 결정하는 방법입니다.

쉽게말해서
5 4 3 2 1
4 5 3 2 1
4 3 5 2 1
4 3 2 5 1
4 3 2 1 5

인접해 있는 두수를 비교해가는 정렬법을 뜻합니다
 

앞서 했던 선택정렬에서 조금만 수정하면됩니다 오히려 선택정렬이 더 어렵습니다
버블 정렬의 경우 비교되는 2데이터를 차례대로 이중for문을 이용하여 변수 ij를 선언하여 돌려주기만 하면 됩니다

시작 -> 데이터 입력 -> ( 가로for -> 비교 -> 세로for ) -> 출력

.생각할점!
1가지 짚고 넘어가야될점이 있는데 그것은 기존의 코드대로면 정렬이 되는 도중에 정렬이 완료가 되었음에도 불구하고 남은 for문을 통하여 일일이 쓸모없이 비교를 하기 때문입니다 5개 정도의 데이터라면 문제가 없지만 10만개 100만개의 데이터라면 앞에 1만번째 데이터에서 정렬이 완료 되었는데 나머지 9만번 99만번을 수행을 하기 때문입니다 이것을 처리하는 부분을 추가하였습니다

변수를 하나 선언해서 1세트(데이터범위)가 돌아가는 동안 정렬을 한번도 하지 않았다면 break를 걸어주도록 하면됩니다


결과보기>>
5 4 3 2 1을 한번도 정렬을 하지않습니다 그래서 1세트에 나면지를 검사하여보고 정렬할 필요가 없어서 프로그램이 정지되었습니다

뒤에 2개의 데이터만 자리를 바꾸면 끝나게 됩니다 그래서 1세트에서 정렬을 끝내고 2세트에서 아무 변화가 없어서 2세트에서 정지하고 총 8번 검색을 하였습니다 

 
소스보기>> 

#include <stdio.h>

int main()
{
  int iCnum;
  int i;
  int j;
  int iSw;
  int iCnt = 0;
  int iCnt2 = 0;

  int temp;
  int iBuf[10];

  printf("The number of data :");
  scanf("%d",&iCnum);

  fflush(stdin);
  printf("%d Data Write!\n",iCnum);  
  for(i=0;i<iCnum;i++)
  {
    printf("Data in [%d]: ",i);
    scanf("%d",&iBuf[i]);
    fflush(stdin);
  }

  printf("(오름)Decrease 1 / (내림)Increase 2: ");
  scanf("%d",&iSw);

  switch(iSw)
  {
    case 1:
      printf("큰수 - > 작은수\n");
      for(j=1;j<iCnum;j++)
      {
        for(i=1;i<iCnum;i++)
        {  
          if(iBuf[i-1]<iBuf[i])
          {
            temp = iBuf[i-1];
            iBuf[i-1= iBuf[i];
            iBuf[i] = temp;
            iCnt++;
          }
          iCnt2++;
        }
          
        if(iCnt == 0)
        {
          printf("%d세트에서 정지\n",j);
          break;
        }
        iCnt = 0;
      }
      printf("%d검색하였습니다\n",iCnt2);
      break;
    
    case 2:
      printf("작은수 - > 큰수\n");
      for(j=1;j<iCnum;j++)
      {
        for(i=1;i<iCnum;i++)
        {  
          if(iBuf[i-1]>iBuf[i])
          {
            temp = iBuf[i-1];
            iBuf[i-1= iBuf[i];
            iBuf[i] = temp;
          }
        }
        if(iCnt == 0)
        {
          printf("%d세트에서 정지\n",j);
          break;
        }
        iCnt = 0;
      }
      printf("%d검색하였습니다\n",iCnt2);
      break;
  }
  for(i=0;i<iCnum;i++)
  {
    printf(" %d ",iBuf[i]);
  }
  printf("\n");
  return 0;
}

Posted by mantwo