자바의 정석 예제 5-10

 

Q. int arr = new [10]일때 Math.random()으로 임의 값을 넣고, 이 숫자들을 정렬하는 문제.

단순히 값끼리 교환해서 자리를 찾아가는것 뿐만 아니라, 범위값도 신경써서 지정해줘야 한다는게 포인트였다.

 

 

public static void main(String[] args) {
		
		int [] numArr= new int[10];
		
		for (int i=0; i<numArr.length; i++) {
			System.out.print(numArr[i]= (int)(Math.random()*numArr.length));
		}	//	인덱스 0~9에 )~10의 랜덤값을 넣는다
		System.out.println();
		System.out.println();
        
        // ----- 여기까진 무난하게 가능 -----
        // 행이든 열이든 비교 횟수는 전체 자리수 -1 이다.
		
		for (int i=0; i<numArr.length-1; i++) {// 마지막 최종정렬 배열제외한 횟수만큼 돈다
			boolean changed = false; // 자리바꿈이 발생했는지 체크. 매 반복마다 초기화됨
		
			for(int j=0; j<numArr.length-1-i; j++) {
			//i=0일때 마지막자리 확정1, i=1일때 뒤에서 2자리 확정. 즉 마지막 자리부터 확정되는 개수 -1 + -i
				if(numArr[j]> numArr[j+1]) {	// 앞의 인덱스가 뒤 인덱스보다 크면 서로 바꿈
					int tmp= numArr[j];
					numArr[j]= numArr[j+1];
					numArr[j+1]= tmp;
					 changed =true;
					}//if ends			
				} // j ends
			
			if (!changed)
				break;
			
			for (int k=0; k<numArr.length; k++) {
				System.out.print(numArr[k]);
			}
			System.out.println();
		}// for ends				
	} //end of main

 

내부 for문이 돌면서 가로로 모든 숫자를 비교하게 되고, 마지막에 숫자를 가로로 출력한 후 다시 바깥 for문으로 돌아가 수행한다.

단순히 앞뒤 인덱스 한번 비교하고 나오는게 아니라 쭉 훑고 나온다는점을 생각 못해서 헷갈렸다.

 

그래서 내가 회전 횟수를 저렇게 지정해주긴 했지만,

실제로 값을 돌리면 비교값이 별로 없는경우 행개수가 더 적은 경우도 있다.

 

행 회전수는 length-1이라 9회지만, 그 이전 break발생=4회만에 끝
돌만큼 다 도는 경우

+ Recent posts