[Java] 자바 선택정렬 구현하기 / 자바 배열 선택정렬 이론 공부

2020-09-10


선택 정렬(選擇整列, selection sort)은 제자리 정렬 알고리즘의 하나로,

다음과 같은 순서로 이루어진다.

 

주어진 리스트 중에 최솟값을 찾는다.

그 값을 맨 앞에 위치한 값과 교체한다(패스(pass)).

맨 처음 위치를 뺀 나머지 리스트를 같은 방법으로 교체한다.

 

비교하는 것이 상수 시간에 이루어진다는 가정 아래,

n개의 주어진 리스트를 이와 같은 방법으로

정렬하는 데에는 Θ(n2) 만큼의 시간이 걸린다.

선택 정렬은 알고리즘이 단순하며

사용할 수 있는 메모리가 제한적인 경우에 사용 시 성능 상의 이점이 있습니다.

 

출처 : 위키피디아

 

말은 어려워 보일 수 있지만

무작이로 정렬되어 있는 배열

 

4 8 9 10 2 1 3 5 6 7을

1 2 3 4 5 6 7 8 9 10처럼

최솟값을 맨 앞으로 옮기는 정렬이다.

 

코드를 살펴보자!


소스코드 ( do ~ while 문)

 

예제 입력 : 4 8 9 10 2 1 3 5 6 7

		Scanner scan = new Scanner(System.in);		
		int temp = 0;
		//배열의 임시값을 받아줄 변수
		//큰 수가 잠시동안 들어갈 예정
		int number = -1;
		int [] data = new int [10];
		
		do {
			number++;
			data[number] = scan.nextInt();
		}while(number < 9);
		
		//10자리 배열에 원하는 정수 입력;
		
		int i = -1;
		//배열의 회전수를 지정할 변수 
		//do 문을 사용하기 때문에 -1로 입력
		do {
			i++;
			int j = i;
		do {
			j++;
			if(data[i] > data[j]) {
				temp = data[i];
				data[i] = data[j];
				data[j] = temp;
				}
			}while(j < 9);
		}while(i < 8);
		
		for(int k = 0; k <= 9; k++) {
			System.out.print(data[k]);
		}

 

출력값 : 1 2 3 4 5 6 7 8 9 10 

 

do while 문을 사용하여 구현하였다.

하지만 do while 보다는 변수 사용이 적은

이중 for 문으로 추가적인 구현을 해보도록 하겠다.

 


소스코드( 이중 for 문)

 

예제 입력 : 4 8 9 10 2 1 3 5 6 7

		Scanner scan = new Scanner(System.in);
		
		int [] data = new int [10];
		int temp = 0;
		
		for(int i = 0; i <data.length; i++) {
			data[i] = scan.nextInt();
		}
		//10자리 배열에 원하는 정수 입력;
		
		for(int i = 0; i < data.length - 1; i++) {
			for(int j = i + 1; j < data.length; j++) {
				if(data[i] > data[j]) {
					temp = data[i];
					data[i] = data[j];
					data[j] = temp;
				}
			}
		}
		//이중 for 문을 사용하여 i의 위치에 따라.
		//j의 값을 지속적으로 증가시키며 비교해준다.
		
		for(int i = 0; i <data.length; i++) {
			System.out.print(data[i]);
		}

출력값 : 1 2 3 4 5 6 7 8 9 10 

 

코드가 훨씬 깔끔해진 것을 확인할 수 있다.

두 코드 중 어떠한 코드를 사용해도

같은 출력 값이 나오니 본인 성향이 맞게

사용하는 것이 좋을 것 같다.