2011년7월1일_버블정렬, 배열복사방법

 

★ 일이란 없는 것을 만드는게 아니라 널린 것으로 만듬. (응용)
    우리는 엔지니어이지 과학자가 아니다.
    더 응용을 잘하여 사용자에게 얼마나 더 가까운가?에 따라 성공률이 달라진다.
    보다 빨리 만들고 보다 이쁘게 디자인하면 성공할 것이다.
    (내생각엔 마지막에 운이 따라줘야 할 것 같아.)

 

● 버블정렬

image

내림차순정렬시 오름차순으로 정렬된 데이터는 최악의 조건으로 가장 오래걸리나,
임베디드C에 있는 소스코드는 검사코드가 없어 입력에 따른 시간차이가 없이 일정하다.

 

   1:  //버블정렬
   2:  void bubble_sort(int array[], int count)
   3:  {
   4:      int i, j;
   5:   
   6:      printf("array주소 %08X\n", array);
   7:      printf("&array주소 %08X\n", &array);
   8:      
   9:      for(i = 0 ; i < count - 1 ; i++)
  10:      {
  11:          for(j = 0 ; j < count - 1 - i ; j++)
  12:          {
  13:              if(array[j] < array[j + 1])
  14:              {
  15:                  swap(&array[j], &array[j + 1]);
  16:                  printVector(array, 5);
  17:              }
  18:          }
  19:   
  20:          putchar('\n');
  21:      }
  22:   
  23:      return ;
  24:  }

 

정렬이 되었는지 검사하는 코드,

   1:  /버블정렬(내림차순) + 검사코드
   2:  void bubble_sort(int array[], int count)
   3:  {
   4:      int i, j, flag_sorted = 1;
   5:   
   6:      printf("array주소 %08X\n", array);
   7:      printf("&array주소 %08X\n", &array);
   8:      
   9:      for(i = 0 ; i < count - 1 ; i++)
  10:      {
  11:          for(j = 0 ; j < count - 1 - i ; j++)
  12:          {
  13:              if(array[j] < array[j + 1])
  14:              {
  15:                  swap(&array[j], &array[j + 1]);
  16:                  printVector(array, 5);
  17:                  flag_sorted = 0;    //한 번이라도 교체했다면 정렬이 덜 되었다 표시.
  18:              }
  19:          }
  20:          //한 번도 교체되지 않으면 정렬이 되었으니 끝냄.
  21:          if(1 == flag_sorted)    
  22:          {
  23:              break;
  24:          }
  25:          //다시 검사하기 위해 표식을 초기화
  26:          flag_sorted = 1;
  27:   
  28:          putchar('\n');
  29:      }
  30:   
  31:      return ;
  32:  }


● 배열복사방법

   1:  int a[5] = {5, 5, 5, 5, 5};
   2:  int b[5];
   3:  int i;
   4:   
   5:  b = a;         // 상수라 대입불가. 배열은 int * const a (a[])
   6:  b[] = a[];     // 에러!, 선언시만 비울 수 있음.
   7:  b[5] = a[5];   // 인덱스초과, 하나의 원소만 복사.
   8:   
   9:  //방법1. for문
  10:  for(i = 0 ; 5 > i ; ++i)
  11:  {
  12:      b[i] = a[i];
  13:  }
  14:   
  15:  //방법2. memcpy()
  16:  #include <string.h>    //추가해야됨.
  17:  memcpy(b, a, 5);
  18:   
  19:  //방법3.구조체
  20:  typedef struct {
  21:      int a[5];
  22:  } A;
  23:   
  24:  int main()
  25:  {
  26:      A V2, V1 = {{5, 5, 5, 5, 5}};
  27:   
  28:      V2 = V1;
  29:   
  30:      return 0;
  31:  }

나는 방법1을 써왔었다. memcpy( )라는 메모리복사함수를 알았으니 앞으로는 자주 애용할 것이다. (방법2)
방법3은 학생들이 즐겨 쓰는 법이라고 한다. 그다지 좋지 않은 것 같으나…
구조체 복사는 알아 두는 것이 좋을 것이라 생각된다.

//보고서가 왜이리 허접하지 ^^;