/*==================================
■■■ 정렬(sort) 알고리즘 ■■■
==================================*/
// 향상된 버블 정렬(Bubble Sort)
// ※ 앞에서 본 Selection Sort(Test109) Bubble Sort(Test110)
// 더 효율적인건 뭔가요?! (→ 반복의 횟수로 추정)
// 결론 : 같다...... 반복의 횟수가 더 많아서
// 하지만, 향상된 Bubble Sort 는 대상 데이터의 구조에 따라서
// 일반 Bubble Sort 나 Selection Sort 보다 성능이 좋을 수 있다.(아닌경우도 있다는말임)
// 원본 데이터 : 61 15 20 22 30
// 15 20 22 30 61 - 1회전(스왑 발생 점검 : true) → 다음 회전 진행 ○
// 15 20 22 30 61 - 2회전(스왑 발생 점검 : false) → 다음 회전 진행 X
//==>> 1회전 수행.. 2회전 수행.. 을 해보았더니..
// 2회전에서 스왑(자리바꿈)이 전혀 일어나지 않았기 때문에
// 불필요한 추가 연산(더 이상의 회전)은 무의미한 것으로 판단하여
// 수행하지 않는다.
// 실행 예)
// Source Data : 10 50 20 30 40
// Sorted Data : 10 20 30 40 50
// 조건부가 붙으면 1차적으로 if를 활용(트루 폴스 / 특정 수 / .. 활용도 높음)
// 2차적으로 do ~ while 문을 활용(트루 / 폴스만을 볼거면)
//
public class Test111
{
public static void main(String[] args)
{
int [] arr = {10, 50, 20, 30, 40};
final int [] akk = {arr[0], arr[1], arr[2], arr[3], arr[4]};
System.out.print("Source Data :");
for (int n : akk)
System.out.printf("%4d", n);
System.out.println();
/*
10, 50, 20, 30, 40
== --
10, 20, 50, 30, 40
== --
10, 20, 30, 50, 40
== --
10, 20, 30, 40, 50
== --
------------------------ 1회전 → 스왑 발생 ( 최초 arr[i] == )
10, 20, 30, 40, 50
== --
10, 20, 30, 40, 50
== --
10, 20, 30, 40, 50
== --
------------------------ 2회전 → 스왑 발생하지 않음
X
X
------------------------ 3회전 → X
X
------------------------ 4회전 → X
*/
// 향상된 Bubble Sort 구현
int k = 0;
boolean x;
do
{
k++;
x = false; // 조건부로 들어가서 검증해봤는데 자리바꿈이 안일어나면 false로 유지
// x가 true 가 되는순간 종료하고 빠져나간다.
for (int i = 0 ;i<arr.length-k ;i++ ) //
{
// 테스트 System.out.println("회전확인용");
if (arr[i]>arr[i+1])
{
arr[i] = arr[i]^arr[i+1];
arr[i+1] = arr[i+1]^arr[i];
arr[i] = arr[i]^arr[i+1];
x = true;
}
}
}
while (x);
// -- x 변수가 false 라는 것은
// 회전이 구분적으로 발생하는 동안 스왑이 일어나지 않은 경우로
// 더 이상의 반복문 수행은 무의미한 것으로 판단 가능~!!
System.out.print("Sorted Data :");
for (int n : arr)
System.out.printf("%4d", n);
System.out.println();
}
}
// 실행 결과
/*
Source Data : 10 50 20 30 40
Sorted Data : 10 20 30 40 50
계속하려면 아무 키나 누르십시오 . . .
*/
728x90
'JAVA' 카테고리의 다른 글
Test113.java / 클래스 고급 - 상속 / 상속의 기본개념 (Inheritance) (0) | 2022.10.22 |
---|---|
Test112.java / 정렬(sort) 알고리즘 / 사용자로부터 여러 학생의 성적 데이터를 입력받아 점수가 높은 학생부터 낮은 순으로 등수를 부여하여 결과를 출력하는 프로그램 구현 (0) | 2022.10.22 |
Test110.java / 정렬(sort) 알고리즘 / 버블 정렬(Bubble Sort) (0) | 2022.10.22 |
Test109.java / 정렬(sort)알고리즘 / 각종 정렬 실습 (0) | 2022.10.22 |
Test108.java / 주민번호등록 생성 프로그램 / 주민등록번호 유효성 검사 프로그램 만들기 (1) | 2022.10.22 |
댓글