JAVA/개념정리

버블 정렬

hyun9_9 2023. 11. 27. 20:37

배열의 알고리즘

사람한테 쉽다(배우기 쉽다)<->느림(성능이 안좋음)

 

버블정렬은 1회수행시 가장 큰 값이 맨뒤로 이동하는 로직

큰값들을 빠르게 찾아야할때 =>당장에 빨리 큰값을 찾아야 할때 활용 
쉽기 때문에 정렬할 데이터가 소수일때 유리함

ex)

arr=[3,2,5,1,4]

j     j<5     i      i<ar.length-1-j          temp        arr[i]>arr[i+1]
---------------------------------------------------------------------
0     T      0             T                       0                 T
                                                       3
              1              T                       0                F
              2              T                       0                T
                                                       5
              3              T                       0                T
                                                       5
              4              F

1    T      0             T                        0                F
              1             T                        0                T
                                                       3
              2             T                        0                F
              3             F  

arr=[2,3,1,4,5]

1번 정렬을 마친 상태 == 1회전 정렬이 끝났다.      

public class Test02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int [] arr=new int[5];
		arr[0]=3;
		arr[1]=2;
		arr[2]=5;
		arr[3]=4;
		arr[4]=1;
		for(int j=0;j<arr.length;j++) {//정렬을 몇번할지 결정하는 반복문
			//배열의 요소개수만큼  수행하겠다! == 5번 정렬
			boolean flag=true;//정렬 완료 되었을때를 확인
			for (int i = 0; i < arr.length-1-j; i++) {//배열을 1회 정렬할떄 사용되는 반복문
            	int temp=0;
				if(arr[i]>arr[i+1]) {
					temp=arr[i];
					//temp : 임시 저장변수,임시변수
					//변수 값들을 서로 교환하려면 반드시 tmp가 필요함!
					
					arr[i]=arr[i+1];
					arr[i+1]=temp;
					flag=false;
				}
			}//1번 정렬을 마친 상태 == 1회전 정렬이 끝났다.
			
			if(flag==true) {//정렬이 완료되었으면 종료
				break;
			}
			for (int i = 0; i < arr.length; i++) {//한번 돌때 정렬이 어떻게 되었는지 확인
				System.out.print(arr[i]);
			}
			System.out.println();
			
		}
	}

}

 

위 코드 피드백

[1]
"정렬이 다 되면 종료"를 한다>> while사용해야함
변수 공간 필요,대입연사자,조건식 확인

for문을 사용했다면 굳이 종료를 안해도됨(얼마 차이안남)

[2] 
temp 변수의 사용 범위(scope)
scope가 웹에서는 중요한 이슈!

 

피드백을 통한 내가 생각한 코드

public class Test01 {
	
	public static void main(String[] args) {
		int [] arr=new int[5];

		arr[0]=3;
		arr[1]=2;
		arr[2]=5;
		arr[3]=4;
		arr[4]=1;
		
		int cnt = 0;//반복으로 정렬이 어디까지 완료 되었는지 저장하는 변수
		while(true) {//언제 정렬이 완료될지 모르기에 while를 사용하였다
			boolean flag=true;
			for (int i = 0; i < arr.length-1-cnt; i++) {
				//arr길이 -1 줄인 이유는 현재 index에서 다음 index를 비교하기 때문에 사용했고
				//-cnt는 정렬이 완료된 것을 또 정렬 로직을 돌게 하는것이
                //비효율적이기 때문에 사용하였다
				if(arr[i]>arr[i+1]) {
					int temp=arr[i];
					arr[i]=arr[i+1];
					arr[i+1]=temp;
					flag=false;
				}
			}			
			if(flag==true) break;//정렬이 완료되면 true받게 되어 무한반복문 종료
			cnt++;//횟수 증가
			for (int i = 0; i < arr.length; i++) {//한번 돌때 정렬이 어떻게 되었는지 확인
				System.out.print(arr[i]);
			}
			System.out.println();
		}
    }
}