프로그래밍/이론

[정렬 알고리즘] 선택정렬, 삽입정렬, 버블정렬 C++ 구현

윤수루 2019. 4. 4. 22:57

선택 정렬, 삽입정렬, 버블정렬은 모두 최악의 경우 quadratic time에 수행되는 정렬이다.

 

 

 

1. 선택정렬

 

선택 정렬은, i (0~n-1)번째의 인덱스에 i부터 n-1까지 중 가장 작은 값을 넣는 작업을 반복하는 정렬입니다.

 

#include <iostream>
using namespace std;
int main() {

  int n;
  int data[100];
  
  cin >> n;
  
  for(int i = 0; i <n; i++){
    cin >> data[i];
  }
  
  for(int i = 0;i<n; i++){
    // i번째에 최솟값을 넣어라
    int inx = i; // inx = 최솟값
    
    // i번째 ~ 맨 끝까지의 값 중 최솟값 
    for(int j = i ; j <n; j++){
      if(data[inx] > data[j]){ // inx값이 최솟값이 아님
        inx = j;
      }
    }    
    
    // i인덱스랑 inx 인덱스 데이터 swap
    int temp;
    temp = data[i];
    data[i] = data[inx];
    data[inx] = temp;
  }
  
  // 출력
  for(int i = 0; i <n; i++){
    cout << data[i] << " ";
  }
  return 0;
}

 

 

 


 

 

2. 삽입정렬

삽입정렬의 경우, 최악의 경우에는 quadratic time에 수행되지만, 실제로는 입력의 개수가 작다면 O(nlogn) time에 수행되는 다른 정렬들보다 빠른 수행시간을 보입니다.

 

#include <iostream>
using namespace std;

int main() {

  
  int n, data[100];
  cin >> n;
  
  for(int i = 0; i <n; i++){
    cin >> data[i];
  }
  
  
  for(int i = 0; i <n ;i++){
    for(int j = i; j >=1 ; j--){
      
      if(data[j-1] > data[j]){// j : i ~ 1까지(j-1이랑 비교)
        int temp;
        temp = data[j-1];
        data[j-1] = data[j];
        data[j] = temp;
      }
      else break; // 더 크면 더이상 비교할 필요 x(앞은 정렬이 되어있으니까)
      
    }
  }
  
  for(int i = 0; i <n; i++){
    cout << data[i] << " ";
  }
  return 0;
}

 

 


 

3. 버블정렬

버블정렬은 인접한 두 값을 n-1번 ~~~ 1번 비교해서 작은 값을 앞으로 보내는 방식을 취한다.

#include <iostream>
using namespace std;

int main() {

  // 정렬 x | 정렬됨(큰 수) -> |를 점점 앞으로 보냄
  
  int n, data[100];
  cin >> n;
  
  for(int i = 0; i <n; i++)
  {
    cin >> data[i];
  }  

  for(int i = 0; i <n; i++){
    // n번 훑겠다!
    for(int j = 0; j<n-1; j++){
      if(data[j] > data[j+1]){
        int temp;
        temp = data[j];
        data[j] = data[j+1];
        data[j+1] = temp;
      }
    }
  }
  
  
  for(int i = 0; i <n; i++){
    cout << data[i] << " ";
  }
  return 0;
}
반응형