---------------------------------
정렬 알고리즘

1. 원소들을 번호순이나 사전 순서와 같이 일정한 순서대로 열거하는 알고리즘

2.
거품 정렬, 삽입 정렬, 선택 정렬....

3. 거품 정렬(bubble sort) : 두 인접한 원소를 검사하여 정렬하는 방법
55 07 78 12 42  -> 원본 상태

[55 07] 78 12 42  첫 번째 패스
07 [55 78] 12 42
07 55 [78 12] 42
07 55 12 [78 42]
07 55 12 42 [78]

[07 55] 12 42  - 78  두 번째 패스 (가장 오른쪽 값은 제외)
07 [55 12] 42  - 78
07 12 [55 42]  - 78
07 12 42 [55]  - 78

[07 12] 42  - 55 78  세 번째 패스 (오른쪽 값 두 개는 제외)
07 [12 42]  - 55 78
07 12 [42]  - 55 78

[07 12]  - 42 55 78  네 번째 패스 (오른쪽 값 세 개는 제외)
07 [12]  - 42 55 78

07 12 42 55 78 => 정렬 끝

 

문제) 거품 정렬 알고리즘
4 5 3 1 2

1회전 -> ? ? ? ? 5
2회전 -> ? ? ? 4 5
3회전 -> ? ? 3 4 5
4회전 -> ? 2 3 4 5
정렬 완료 -> 1 2 3 4 5

 


//Sample60.java
package com.test;

public class Sample60 {

 public static void main(String[] args) {

  int[] array = {4, 5, 3, 1, 2};
  
  //정렬 과정 추가
  //1. 비교 if(조건)
  //2. 치환  array[n] <= array[n+1];
  //3. 반복 for(초기식;조건식;증감식)
  
  //a->0부터 (n-2)까지
  //b->1부터 (n-1)까지->a+1
  /*
  if (array[0] > array[1]) {
   int temp = array[1];
   array[1] = array[0];
   array[0] = temp;
  }
  if (array[1] > array[2]) {
   int temp = array[2];
   array[2] = array[1];
   array[1] = temp;
  }
  if (array[2] > array[3]) {
   int temp = array[3];
   array[3] = array[2];
   array[2] = temp;
  }
  if (array[3] > array[4]) {
   int temp = array[4];
   array[4] = array[3];
   array[3] = temp;
  }
  */
  int n = array.length;
  for (int a=0; a<n-1; ++a) {
   if (array[a] > array[a+1]) {
    int temp = array[a+1];
    array[a+1] = array[a];
    array[a] = temp;
   }
  }
  
  for (int a=0; a<array.length; ++a) {
   System.out.printf(" %d", array[a]);
  }
  System.out.println();
  
 }

}

 

 


거품 정렬 구현 코드
//Sample61.java
package com.test;

public class Sample61 {

 public static void main(String[] args) {

  int[] array = {4, 5, 3, 1, 2};
  
  //정렬 과정 추가
  //1. 비교 if(조건)
  //2. 치환  array[n] <= array[n+1];
  //3. 반복 for(초기식;조건식;증감식)

  //n이 5인 경우 4회전, 10인 경우 9회전
  //n->length부터 2까지
  //a->0부터 (n-2)까지
  //b->1부터 (n-1)까지->a+1
  for (int n=array.length; n>=2; --n) {
   for (int a=0; a<n-1; ++a) {
    if (array[a] > array[a+1]) {
     int temp = array[a+1];
     array[a+1] = array[a];
     array[a] = temp;
    }
   }
  }
  
  for (int a=0; a<array.length; ++a) {
   System.out.printf(" %d", array[a]);
  }
  System.out.println();
  
 }

}

 

 


//Sample62.java
package com.test;

public class Sample62 {

 public static void main(String[] args) {

  int[] array = {4, 5, 6, 3, 7, 1, 2};
  
  //정렬 과정 추가
  //1. 비교 if(조건)
  //2. 치환  array[n] <= array[n+1];
  //3. 반복 for(초기식;조건식;증감식)

  //n이 5인 경우 4회전, 10인 경우 9회전
  //n->1부터 1씩 증가하도록 작성
  //a->0부터 (n-2)까지
  //b->1부터 (n-1)까지->a+1
  for (int n=1; n<array.length ;++n) {
   for (int a=0; a<array.length-n; ++a) {
    if (array[a] > array[a+1]) {
     int temp = array[a+1];
     array[a+1] = array[a];
     array[a] = temp;
    }
   }
  }
  
  for (int a=0; a<array.length; ++a) {
   System.out.printf(" %d", array[a]);
  }
  System.out.println();
  
 }

}

 


-------------------------------------------------


//Sample63.java
package com.test;

public class Sample63 {

 public static void main(String[] args) {

  int[] array = {4, 5, 3, 1, 2};
  
  //정렬 과정 추가
  //1. 비교 if(조건)
  //2. 치환  array[n] <= array[n+1];
  //3. 반복 for(초기식;조건식;증감식)

  //n이 5인 경우 4회전, 10인 경우 9회전
  //n->1부터 1씩 증가하도록 작성
  //a->0부터 (n-2)까지
  //b->1부터 (n-1)까지->a+1
  for (int n=1; n<array.length ;++n) {
   for (int a=0; a<array.length-n; ++a) {
    if (array[a] > array[a+1]) {
     int temp = array[a+1];
     array[a+1] = array[a];
     array[a] = temp;
    }
   }
   
   //중간 결과 출력
   for (int a=0; a<array.length; ++a) {
    if (a == array.length-n) {
     System.out.print(" <");
    }
    System.out.printf(" %d", array[a]);
   }
   System.out.println();   
  }

  //최종 결과 출력
  System.out.println("--------------------");
  for (int a=0; a<array.length; ++a) {
   System.out.printf(" %d", array[a]);
  }
  System.out.println();
  
 }

}

 


문제) 외부에서 여러개의 숫자를 입력 받은 후에, 정렬(거품정렬) 시켜서 출력.
입력 범위(2~n)?5
정수1?5
정수2?2
정수3?3
정수4?1
정수5?4

정렬 결과 : 1 2 3 4 5

 


---------------------------------------------------


4. 선택 정렬(selection sort) : 전체 리스트에서 최소값을 가장 앞에 위치시키는 정렬 방법. 비교는 가장 앞에 있는 값과 나머지 값들을 비교.
55 07 78 12 42  -> 원본 상태

[55] [07] 78 12 42 첫 번째 패스
[07] 55 [78] 12 42
[07] 55 78 [12] 42
[07] 55 78 12 [42]
[07] 55 78 12 42

07 - [55] [78] 12 42 두 번째 패스 (가장 왼쪽 값은 제외)
07 - [55] 78 [12] 42
07 - [12] 78 55 [42]
07 - [12] 78 55 42

07 12 - [78] [55] 42 세 번째 패스 (왼쪽 두 개는 제외)
07 12 - [55] 78 [42]
07 12 - [42] 78 55

07 12 42 - [78] [55] 네 번째 패스 (왼쪽 세 개는 제외)
07 12 42 - [55] 78

07 12 42 55 78 -> 정렬 결과

 


문제) 선택 정렬 알고리즘
4 5 3 1 2

1회전 -> 1 ? ? ? ?
2회전 -> 1 2 ? ? ?
3회전 -> 1 2 3 ? ?
4회전 -> 1 2 3 4 ?
정렬 완료 -> 1 2 3 4 5

 


//Sample64.java
package com.test;

public class Sample64 {

 public static void main(String[] args) {

  int[] array = {4, 5, 3, 1, 2};
  
  //정렬 과정 추가
  //1. 비교 if(조건)
  //2. 치환  array[n] <= array[n+1];
  //3. 반복 for(초기식;조건식;증감식)
  
  /*
  if (array[0] > array[1]) {
   int temp = array[1];
   array[1] = array[0];
   array[0] = temp;   
  }
  if (array[0] > array[2]) {
   int temp = array[2];
   array[2] = array[0];
   array[0] = temp;   
  }
  if (array[0] > array[3]) {
   int temp = array[3];
   array[3] = array[0];
   array[0] = temp;   
  }
  if (array[0] > array[4]) {
   int temp = array[4];
   array[4] = array[0];
   array[0] = temp;   
  }
  */
  
  //n => 갯수
  //a => 0
  //b => 1 ~ (n-1)
  int n=array.length;
  int a=0;
  for (int b=1; b<n; ++b) {
   if (array[a] > array[b]) {
    int temp = array[b];
    array[b] = array[a];
    array[a] = temp;   
   }
  }
  
  for (int c=0; c<array.length; ++c) {
   System.out.printf(" %d", array[c]);
  }
  System.out.println();  
  
 }

}

 

 

선택 정렬 구현 코드
//Sample65.java
package com.test;

public class Sample65 {

 public static void main(String[] args) {

  int[] array = {4, 5, 3, 1, 2};
  
  //정렬 과정 추가
  //1. 비교 if(조건)
  //2. 치환  array[n] <= array[n+1];
  //3. 반복 for(초기식;조건식;증감식)
  
  //n => 갯수(array.length)
  //a => 0 ~ (n-2)
  //b => (a+1) ~ (n-1)
  for (int a=0; a<array.length-1; ++a) {
   for (int b=(a+1); b<array.length; ++b) {
    if (array[a] > array[b]) {
     int temp = array[b];
     array[b] = array[a];
     array[a] = temp;   
    }
   }

   //중간 결과 출력
   for (int c=0; c<array.length; ++c) {
    if (c == (a+1)) {
     System.out.print(" <");
    }
    System.out.printf(" %d", array[c]);
   }
   System.out.println(); 


  }
  
  for (int c=0; c<array.length; ++c) {
   System.out.printf(" %d", array[c]);
  }
  System.out.println();  
  
 }

}

 

 

문제) 외부에서 여러개의 숫자를 입력 받은 후에, 정렬(선택정렬) 시켜서 출력.

입력 범위(2~n)?5
정수1?5
정수2?2
정수3?3
정수4?1
정수5?4

정렬 결과 : 1 2 3 4 5

 

 

 


-----------------------------------
삽입 정렬(insertion sort)

1. 자료 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여, 자신의 위치를 찾아 삽입함으로써 정렬을 완성하는 알고리즘

55 07 78 12 42  -> 원본 상태

55 (07) 78 12 42 -> key        첫 번째 패스
[55] 07 78 12 42 - [key=07]
55 [55] 78 12 42
[07] 55 78 12 42 <- [key=07]
[07] 55 78 12 42

07 55 (78) 12 42 -> key       두 번째 패스
07 [55] 78 12 42 - [key=78]
[07] 55 78 12 42 - [key=78]
07 55 [78] 12 42 <- [key=78]
07 55 [78] 12 42

07 55 78 (12) 42 -> key      세 번째 패스
07 55 [78] 12 42 - [key=12]
07 55 78 [78] 42
07 [55] 78 78 42 - [key=12]
07 55 [55] 78 42
[07] 55 55 78 42 - [key=12]
07 [12] 55 78 42 <- [key=12]
07 [12] 55 78 42

07 12 55 78 (42) -> key     네 번째 패스
문제) 선택 정렬의 네 번째 패스에서 나머지 숫자 배열을 채웁니다.

 


------------------------------------------
여러명의 점수를 입력 받고, 점수가 높은 순으로 등수 부여해서 출력하는 과정 작성. 이름과 점수는 별도의 배열에 저장.
실행 예)
입력 범위(2~n)?3
이름 점수(1)?kim 30
이름 점수(2)?choi 70
이름 점수(3)?park 60
---------------------
1등 choi 70
2등 park 60
3등 kim 30
---------------------

//Sample48.java
package com.test;

import java.util.Scanner;

public class Sample48 {
 
 public static void main(String[] args) {
  
  //여러명의 이름, 점수 입력 -> 배열 2개
  Scanner sc = new Scanner(System.in);
  System.out.print("인원수(n)?");
  int size = sc.nextInt();
  String[] names = new String[size];
  int[] scores = new int[size];
  
  for (int i=0; i<names.length; ++i) {
   System.out.printf("이름 점수(%d)?", (i+1));
   names[i] = sc.next();
   scores[i] = sc.nextInt();
  }
  sc.close();
  
  //점수가 높은 순으로 정렬 (내림차순)
  //n회전 반복
  //1회전 반복
  //비교대상
  //치환
  for (int b=0; b<scores.length-1; ++b) {
   for (int a=0; a<scores.length-1-b; ++a) {
    if (scores[a] < scores[a+1]) {
     String temp1 = names[a+1];
     names[a+1] = names[a];
     names[a] = temp1;
     int temp2 = scores[a+1];
     scores[a+1] = scores[a];
     scores[a] = temp2;
    }
   }
  }
  
  //배열->출력
  for (int b=0; b<scores.length; ++b) {
   System.out.printf("%d등 %s %d %n"
       , (b+1)
       , names[b]
       , scores[b]);
  }
  System.out.println();

 }

}

 

 

문제) 위의 결과에서 정렬 알고리즘을 선택 정렬로 수정할 것.
//Sample49.java
package com.test;

import java.util.Scanner;

public class Sample49{
 
 
 public static void main(String[] args) {
  
  //여러명의 이름, 점수 입력 -> 배열 2개
  Scanner sc = new Scanner(System.in);
  System.out.print("인원수(n)?");
  int size = sc.nextInt();
  String[] names = new String[size];
  int[] scores = new int[size];
  
  for (int i=0; i<names.length; ++i) {
   System.out.printf("이름 점수(%d)?", (i+1));
   names[i] = sc.next();
   scores[i] = sc.nextInt();
   
  }
  sc.close();
  
  //문제) 점수가 높은 순으로 정렬 (선택정렬, 내림차순)
  

 

  
  //배열->출력
  for (int b=0; b<scores.length; ++b) {
   System.out.printf("%d등 %s %d %n"
       , (b+1)
       , names[b]
       , scores[b]);
  }
  System.out.println();

 }

}

 

 

 


-------------------------------------------
과제) 삽입 정렬 순서도(삽입정렬_순서도.png)를 완성하고, Java 프로그램으로 작성.

 

 

 

 


-------------------------------------------
요약

1. 정렬 알고리즘
2. 거품 정렬 : 인접한 두 숫자 비교, 큰 값 오른쪽.
3. 선택 정렬 : 기준값과 나머지를 비교. 작은 값 왼쪽.
3. 삽입 정렬 : key 변수 필요. key 변수에 기준값 저장. key와 나머지 값과 비교. 자기 위치를 찾아서 삽입.

-------------------------------------------

 

 

 

 

 

 


 

'HTML/CSS' 카테고리의 다른 글

4일차_CSS  (0) 2015.06.21
3일차_HTML 태그의 종류, CSS  (0) 2015.06.21
2일차_HTML 태그의 종류  (0) 2015.06.21
1일차_웹어플리케이션개요, HTML개요, CSS개요.txt  (0) 2015.06.21
블로그 이미지

알 수 없는 사용자

,