정렬 알고리즘에는 크게 버블정렬, 삽입 정렬, 퀵정렬, 선택정렬 등이있는데 그중에서 가장 쉬운것으로 유명한 버블정렬에 대해 알아보도록 하겠습니다.
이 프로그램은 오름차순과 내림차순을 버블정렬로 나타내는 프로그램입니다.
#include
#include
#include
using namespace std;
int main()
{
int n,s,a[100],tmp;
char x;
while(1){
cout<<"\n===============================================\n프로그램을 종료하려면 x키를 누르시오.\n다른 키를 누를경우 계속합니다.";
//printf("\n===============================================\n프로그램을 종료하려면 x키를 누르시오.\n다른 키를 누를경우 계속합니다.");
x=getch();
if(x=='x'){
cout<<"\n프로그램이 종료되었습니다."<<endl;
//printf("\n프로그램이 종료되었습니다.\n");
break;
}
cout<<"\n\n==============================================="<<endl;
cout<<"입력할 숫자의 개수를 입력하시오(1~100) : ";
cin>>n;
while(1){
cout<<"오름차순을 원하면 1\n내림차순을 원하면 2\n둘 중 하나를 선택하시오.";
//printf("오름차순을 원하면 1\n내림차순을 원하면 2\n둘 중 하나를 선택하시오.");
cin>>s;
//scanf("%d,&s);
if(s==1||s==2){
break;
}else{
cout<<"\n=====================\n잘못된 입력입니다.\n=====================\n"<<endl;
//printf("\n=====================\n잘못된 입력입니다.\n=====================\n\n");
}
}
cout<<"\n"<<n<<"가지 숫자를 입력하시오 : ";
for(int i=0; i<n; i++){
//scanf("%d",&a[i]);
cin>>a[i];
}
for(int i=0; i<n-1; i++){
for(int j=i+1; j<n; j++){
if(s==1){
if(a[i]>a[j]){
tmp=a[j];
a[j]=a[i];
a[i]=tmp;
}
}else if(s==2){
if(a[i]<a[j]){
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
}
}
}
if(s==1){
cout<<"\n오름차순 입니다."<<endl;
//printf("\n오름차순 입니다.\n");
}else{
cout<<"\n내림차순 입니다."<<endl;
//printf("\n내림차순 입니다.");
}
for(int i=0; i<n; i++){
//printf("%d번쨰 : %d",i+1,a[i]);
cout<<i+1<<"번째: "<<a[i]<<endl;
}
}
}
프로그램을 제작할때 printf나 scanf같이 간단한것은 c로 하는게 더 간단해서 c로 했기때문에 c++구문 밑에는 주석처리로 C언어를 나타내게 하였습니다.
그렇다면 버블벙렬이라는것은 무엇일까요?
일단 이름처럼 순서대로 정렬을 하는것입니다.
영어로는 bubble sort라고 합니다.
그렇다면 이 버블정렬은 이 프로그램에서 어떤 곳에서 비교를 할까요?
for(int i=0; i<n-1; i++){
for(int j=i+1; j<n; j++){
if(s==1){
if(a[i]>a[j]){
tmp=a[j];
a[j]=a[i];
a[i]=tmp;
}
}else if(s==2){
if(a[i]<a[j]){
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
}
}
}
이 부분인데요 for문에서 i=0인데 j=i+1은 배열의 앞뒤를 비교하는것이고 그 비교한것을 tmp에 저장했다가 다시 뒤에있는것과 비교하여 for문안에 첫번째 if문에 따라서 큰수부터 작은수를 할지 작은수부터 큰 수를 할지 비교하는 것입니다.
그렇게 비교하여 작은것부터 큰것인 오름차순 정렬을 하면 큰수가 있으면 뒤에있는 메모리에 대입하고 그 뒤에있던것은 앞으로 오는 스왑 구조를 취하게됩니다.
제가 짠 코드를 보다가 이해가 안되는 부분이있으면 댓글로 설명해드리도록 하겠습니다. 가장 좋은 실력 향상방법은 혼자서 분석하다가 막히는것을 찾아가면서 공부하는것이 좋다고 생각해서 일일이 주석으로 설명을 달지 않겠습니다.
감사합니다.^^