/*
 http://sosal.tistory.com/
 * made by so_Sal
 */

거품정렬입니다.

[][][][][][][][] <-- 여기서 최대값을 가장 오른쪽으로
[][][][][][][]■  <-- 최대값 하나를 찾아으니, 나머지 중 최대값을 가장 오른쪽으로
[][][][][][]■ ■  <-- 이런식으로 하나씩 하나씩 최대값을 오른쪽으로 옮기는것
[][][][][]■ ■ ■ 
[][][][]■ ■ ■ ■ 
[][][]■ ■ ■ ■ ■ 
[][]■ ■ ■ ■ ■ ■  <-- 2개밖에 남질 않았습니다. 높은것을 오른쪽으로..
[]■ ■ ■ ■ ■ ■ ■  <-- 이미 맨 왼쪽은 최소값이겠죠?

거품이 오른쪽부터 뽀글뽀글 올라오는 모습이 연상된다고
거품정렬이란 이름이 붙었습니다;
흠.. 잘 모르겠네영 -.-;;

#include<iostream>
#include<ctime>
using namespace std;

void swap(int *a,int *b){
    int tmp;
    tmp = *b;
    *b = *a;
    *a = tmp;
}              //sort 하는 과정에서 swap을 구현하면 소스가 지져분해지므로 이렇게 함수를 만듬.

void bubble(int *a,int length){
    for(int i=0;i<length-1;i++){
        for(int j=0;j<length-(i+1);j++) //이미 가장 오른쪽 정렬이 되어있기 때문에 length-(i+1)까지
            if(a[j] > a[j+1])
                swap(a[j],a[j+1]); //두칸씩 비교해나가면서 높은걸 오른쪽으로!
    }
}

int main(){
    int a[30];
    srand(time(0));
   
    for(int i=0;i<15;i++)
        a[i] = rand()%100;   //15개의 숫자를 마구잡이로 집어넣음

    bubble(a,15);  //정렬 후

    for(int i=0;i<15;i++)
        printf("%d ",a[i]); //출력!

   
    return 0;
}



Posted by sosal sosal

댓글을 달아 주세요

  1. 2011.01.21 11:26 신고

    컴퓨터학부재학중인 학생인데요.. 방학을 이용해서 공부중인데
    매개변수 넘겨받는 곧에서 딱 막혀버려서요;;ㅠ

    구제체를 사용해서 버블소트를 짜는데요.
    구조체에 int, char, char[] 이렇게 들어가있는데요..
    그걸 void *를 사용해서 접근하고 매개변수를 넘기고 받고 계산을 할수있을까요?? 예: struct student *data[3]={{24, "홍길동", "123456789"},
    {.....},{....}} 이렇게 포이트형으로 자료를 입력후에 위에 swap에서 불러다 쓸때랑 bubble에서 사용할때 매개변수 넘기는걸 어떻게 해야하나요??ㅠ


    #퀵정렬에 기본형태(아래)를 가져와서 버블로도 만들수있나요?
    void sort(void *base, size_t.........int(*compare)(const void*, const void*)) 이 형태도 잘 이해가 안가고요..ㅠ

    • 2011.01.21 16:20 신고

      #include<iostream>
      #include<ctime>
      using namespace std;

      typedef struct {
      int order;
      int id;
      char name[30];
      } student;

      void swap(student *a, student *b);
      void bubble(student *data,int length);


      int main(){
      int i;
      char name[10]="student0";
      student list[5];

      for(i=0;i<5;i++){
      list[i].order = i;
      list[i].id = rand()%1000;
      strcpy(list[i].name,name);
      name[7]++;
      }

      for(i=0;i<5;i++)
      printf("%d %3d %s\n",list[i].order,list[i].id,list[i].name);
      printf("==========================\n");
      swap(&list[1],&list[3]);

      for(i=0;i<5;i++)
      printf("%d %3d %s\n",list[i].order,list[i].id,list[i].name);
      printf("==========================\n");
      bubble(list,5);

      for(i=0;i<5;i++)
      printf("%d %3d %s\n",list[i].order,list[i].id,list[i].name);
      printf("==========================\n");
      return 0;
      }




      void swap(student *a, student *b){
      student tmp;

      tmp.order = a->order;
      tmp.id = a->id;

      strcpy(tmp.name,a->name);

      a->order = b->order;
      a->id = b->id;
      strcpy(a->name,b->name);

      b->order = tmp.order;
      b->id = tmp.id;
      strcpy(b->name,tmp.name);
      }

      void bubble(student *data,int length){
      for(int i=0;i<length-1;i++){
      for(int j=0;j<length-(i+1);j++)
      if(data[j].id > data[j+1].id)
      swap(data[j],data[j+1]);
      }

      }

      포인터 사용법에 대해서 익숙하지 않으신가보네요
      대충 슥슥 만드느라 코드가 깔끔하지 않네요.
      주석은 없지만 함수부분 코드와 실행 결과 보시면
      쉽게 이해할 수 있을거에요.
      모르는게 있다면 댓글주세요 ㅎㅎ

  2. 2011.01.22 02:18 신고

    감사합니다.포인터를 공부중인거거든요^^;;
    코드는 알겠는데요.swap이나 bubble에서요 student *a 가 아니라 void *a 로 하려고 하는데요..ㅠ
    void형 크기를 알수 없어서 사용하기 사용할수 없던데,해결할수 있는 방법이 있나요??

    꼽사리:혹시 프로그램쪽 직장에서 일하시는 분이신지 궁금하네요^^??

    • 2011.01.22 20:39 신고

      void 포인터에 대해서 따로 공부해보시는게 좋을 것 같아요.
      포인터의 크기는 모든 자료형에 대해 4byte로 일정하기 때문에 어떤 자료형이든 자유롭게 담을 수 있어요.
      하지만 형변환에 신경을 많이 써주셔야합니다.

      void를 사용하려고 하는 이유가 사용되는 자료들의 다양성을 위한것이라면
      오버로딩을 공부하시면 되겠네요 ㅎㅎ

      전 평범한 대학생이에요 ㅎㅎ
      더 궁금하신거 있으시면 댓글이나
      sosal@hanmail.net 메일로 주세요~
      메신져 등록도 환영 ㅋㅋ
      NateOn : tkdlvk27@cyworld.com

  3. 2011.01.23 22:03 신고

    감사합니다^^ 대학생이신데..많은것을 알고계시군요^^;;
    제가 네이트온을 않해서..ㅠ 메일이나 댓글로 문의드릴께요~

  4. 2011.01.27 01:12 신고

    질문이 생겨서 글남기게 되었습니다^^;;
    struct a{int a; char *b; char c[10]} 구조체 선언이 있구요.
    struct data[3]={{...},{...},{...}} 이렇게 되어있을때 data[n]과data[n+1]을 통체로 바꿀수도 있나요? swap을 사용할때 위에처럼 일일이 한개씩 대입하지 않고 전체를 다 바꿀수 있는 거요.. 답변 부탁드리겠습니다^^