알고보면코딩천재

java 배열과 정렬 (버블정렬) 본문

Java

java 배열과 정렬 (버블정렬)

알코천 2022. 8. 1. 10:58
package ex06;

public class ArrayEx01 {

	public static void main(String[] args) {
		int[] arr = new int[3]; // 우변 : heap공간에 12Byte가 뜬다. arr는 레퍼런스 heap에 뜬다.
		// arr = *0번지 

		arr[0] = 10;
		arr[1] = 20;
		arr[2] = 30;
		
		for(int i =0; i<arr.length; i++) {
			System.out.println(arr[i]);
		}
	}

}

 

배열은 시작번지를 엑세스한다.

실행시에 발생하는 예외-  런타임exception

 

 

배열 정렬

package ex06;

public class BubbleEx01 {

	public static void main(String[] args) {
		int[] arr = { 40, 30, 10, 8, 5 };
		// 10, 40, 5, 30, 8 [0,1]
		// 10, 5, 40, 30, 8 [1.2]
		// 10, 5, 30, 40, 8 [2,3]
		// 10, 5, 30, 8, 40 [3,4]

		// 5, 10, 30, 8, 40 [0,1]
		// 5, 10, 30, 8, 40 [1,2]
		// 5, 10, 8, 30, 40 [2,3]
		// 5, 10, 8, 30, 40 [3,4]

		// 5, 10, 8, 30, 40 [0,1]
		// 5, 8, 10, 30, 40 [1,2]
		// 5, 8, 10, 30, 40 [2,3]
		// 5, 8, 10, 30, 40 [3,4]

		// 첫번째 사이클
		if (arr[0] > arr[1]) {
			int temp;
			temp = arr[0];
			arr[0] = arr[1];
			arr[1] = temp;
		}
		if (arr[1] > arr[2]) {
			int temp;
			temp = arr[1];
			arr[1] = arr[2];
			arr[2] = temp;
		}
		if (arr[2] > arr[3]) {
			int temp;
			temp = arr[2];
			arr[2] = arr[3];
			arr[3] = temp;
		}
		if (arr[3] > arr[4]) {
			int temp;
			temp = arr[3];
			arr[3] = arr[4];
			arr[4] = temp;
		}

		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
		System.out.println("첫번째 사이클 종료 =====");

		// 두번째 사이클
		if (arr[0] > arr[1]) {
			int temp;
			temp = arr[0];
			arr[0] = arr[1];
			arr[1] = temp;
		}
		if (arr[1] > arr[2]) {
			int temp;
			temp = arr[1];
			arr[1] = arr[2];
			arr[2] = temp;
		}
		if (arr[2] > arr[3]) {
			int temp;
			temp = arr[2];
			arr[2] = arr[3];
			arr[3] = temp;
		}
		if (arr[3] > arr[4]) {
			int temp;
			temp = arr[3];
			arr[3] = arr[4];
			arr[4] = temp;
		}

		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
		System.out.println("두번째 사이클 종료 =====");

		// 세번째 사이클
		if (arr[0] > arr[1]) {
			int temp;
			temp = arr[0];
			arr[0] = arr[1];
			arr[1] = temp;
		}
		if (arr[1] > arr[2]) {
			int temp;
			temp = arr[1];
			arr[1] = arr[2];
			arr[2] = temp;
		}
		if (arr[2] > arr[3]) {
			int temp;
			temp = arr[2];
			arr[2] = arr[3];
			arr[3] = temp;
		}
		if (arr[3] > arr[4]) {
			int temp;
			temp = arr[3];
			arr[3] = arr[4];
			arr[4] = temp;
		}

		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
		System.out.println("세번째 사이클 종료 =====");
		
		// 네번째 사이클
		if (arr[0] > arr[1]) {
			int temp;
			temp = arr[0];
			arr[0] = arr[1];
			arr[1] = temp;
		}
		if (arr[1] > arr[2]) {
			int temp;
			temp = arr[1];
			arr[1] = arr[2];
			arr[2] = temp;
		}
		if (arr[2] > arr[3]) {
			int temp;
			temp = arr[2];
			arr[2] = arr[3];
			arr[3] = temp;
		}
		if (arr[3] > arr[4]) {
			int temp;
			temp = arr[3];
			arr[3] = arr[4];
			arr[4] = temp;
		}

		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
		System.out.println("네번째 사이클 종료 =====");
	}

}

배열의 순서가 어떻게 되느냐에 따라 사이클을 몇번씩 돌려야하는 불편함이 있다.

 

 

버블정렬 알고리즘으로

다시 작성해보면

package ex06;

public class BubbleEx01 {

	public static void main(String[] args) {
		int[] arr = { 40, 30, 10, 8, 5 };
		// 10, 40, 5, 30, 8 [0,1]
		// 10, 5, 40, 30, 8 [1.2]
		// 10, 5, 30, 40, 8 [2,3]
		// 10, 5, 30, 8, 40 [3,4]

		// 5, 10, 30, 8, 40 [0,1]
		// 5, 10, 30, 8, 40 [1,2]
		// 5, 10, 8, 30, 40 [2,3]

		// 5, 10, 8, 30, 40 [0,1]
		// 5, 8, 10, 30, 40 [1,2]

		// 첫번째 사이클
		if (arr[0] > arr[1]) {
			int temp;
			temp = arr[0];
			arr[0] = arr[1];
			arr[1] = temp;
		}
		if (arr[1] > arr[2]) {
			int temp;
			temp = arr[1];
			arr[1] = arr[2];
			arr[2] = temp;
		}
		if (arr[2] > arr[3]) {
			int temp;
			temp = arr[2];
			arr[2] = arr[3];
			arr[3] = temp;
		}
		if (arr[3] > arr[4]) {
			int temp;
			temp = arr[3];
			arr[3] = arr[4];
			arr[4] = temp;
		}

		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
		System.out.println("첫번째 사이클 종료 =====");

		// 두번째 사이클
		if (arr[0] > arr[1]) {
			int temp;
			temp = arr[0];
			arr[0] = arr[1];
			arr[1] = temp;
		}
		if (arr[1] > arr[2]) {
			int temp;
			temp = arr[1];
			arr[1] = arr[2];
			arr[2] = temp;
		}
		if (arr[2] > arr[3]) {
			int temp;
			temp = arr[2];
			arr[2] = arr[3];
			arr[3] = temp;
		}

		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
		System.out.println("두번째 사이클 종료 =====");

		// 세번째 사이클
		if (arr[0] > arr[1]) {
			int temp;
			temp = arr[0];
			arr[0] = arr[1];
			arr[1] = temp;
		}
		if (arr[1] > arr[2]) {
			int temp;
			temp = arr[1];
			arr[1] = arr[2];
			arr[2] = temp;
		}

		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
		System.out.println("세번째 사이클 종료 =====");
		
		// 네번째 사이클
		if (arr[0] > arr[1]) {
			int temp;
			temp = arr[0];
			arr[0] = arr[1];
			arr[1] = temp;
		}


		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
		System.out.println("네번째 사이클 종료 =====");
	}

}

이것을 패턴으로 만들때는

상수와 변수를 구분해야한다.

리팩토링(코드수정)

package ex06;

public class BubbleEx02 {

	public static void main(String[] args) {
		int[] arr = { 50, 40, 30, 10, 8, 5 };

		// 첫번째 사이클
		for (int i = 0; i < 5; i++) {

			if (arr[i] > arr[i + 1]) {
				int temp;
				temp = arr[i];
				arr[i] = arr[i + 1];
				arr[i + 1] = temp;
			}
		}

		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
		System.out.println("첫번째 사이클 종료 =====");

		// 두번째 사이클
		for (int i = 0; i < 4; i++) {

			if (arr[i] > arr[i + 1]) {
				int temp;
				temp = arr[i];
				arr[i] = arr[i + 1];
				arr[i + 1] = temp;
			}
		}

		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
		System.out.println("두번째 사이클 종료 =====");

		// 세번째 사이클
		for (int i = 0; i < 3; i++) {

			if (arr[i] > arr[i + 1]) {
				int temp;
				temp = arr[i];
				arr[i] = arr[i + 1];
				arr[i + 1] = temp;
			}
		}

		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
		System.out.println("세번째 사이클 종료 =====");

		// 네번째 사이클
		for (int i = 0; i < 2; i++) {

			if (arr[i] > arr[i + 1]) {
				int temp;
				temp = arr[i];
				arr[i] = arr[i + 1];
				arr[i + 1] = temp;
			}
		}

		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
		System.out.println("네번째 사이클 종료 =====");

		// 다섯번째 사이클
		for (int i = 0; i < 1; i++) {

			if (arr[i] > arr[i + 1]) {
				int temp;
				temp = arr[i];
				arr[i] = arr[i + 1];
				arr[i + 1] = temp;
			}
		}

		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
		System.out.println("다섯번째 사이클 종료 =====");
	}

}
package ex06;

public class BubbleEx02 {

	public static void main(String[] args) {
		int[] arr = { 50, 40, 30, 10, 8, 5 };
		int n = 0;
		int k = arr.length;

		// 첫번째 사이클
		n++;
		k--;
		for (int i = 0; i < k; i++) {

			if (arr[i] > arr[i + 1]) {
				int temp;
				temp = arr[i];
				arr[i] = arr[i + 1];
				arr[i + 1] = temp;
			}
		}

		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
		System.out.println(n+"번째 사이클 종료 =====");

		// 두번째 사이클
		n++;
		k--;
		for (int i = 0; i < k; i++) {

			if (arr[i] > arr[i + 1]) {
				int temp;
				temp = arr[i];
				arr[i] = arr[i + 1];
				arr[i + 1] = temp;
			}
		}

		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
		System.out.println(n+"번째 사이클 종료 =====");

		// 세번째 사이클
		n++;
		k--;
		for (int i = 0; i < k; i++) {

			if (arr[i] > arr[i + 1]) {
				int temp;
				temp = arr[i];
				arr[i] = arr[i + 1];
				arr[i + 1] = temp;
			}
		}

		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
		System.out.println(n+"번째 사이클 종료 =====");

		// 네번째 사이클
		n++;
		k--;
		for (int i = 0; i < k; i++) {

			if (arr[i] > arr[i + 1]) {
				int temp;
				temp = arr[i];
				arr[i] = arr[i + 1];
				arr[i + 1] = temp;
			}
		}

		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
		System.out.println(n+"번째 사이클 종료 =====");

		// 다섯번째 사이클
		n++;
		k--;
		for (int i = 0; i < k; i++) {

			if (arr[i] > arr[i + 1]) {
				int temp;
				temp = arr[i];
				arr[i] = arr[i + 1];
				arr[i + 1] = temp;
			}
		}

		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
		System.out.println(n+"번째 사이클 종료 =====");
	}

}

 

이것을 

for문으로

 

package ex06;

public class BubbleEx04 {

   public static void main(String[] args) {
      int[] arr = { 50, 40, 30, 10, 8, 5 };
      int n = 0;
      
      for(int k=arr.length-1; k>0; k--) {
         n++;
         for(int i=0; i<k; i++) {
            if (arr[i] > arr[i+1]) {
               int temp;
               temp = arr[i];
               arr[i] = arr[i+1];
               arr[i+1] = temp;
            }
         }

         for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
         }
         System.out.println(n+"번째 사이클 종료====");
      }
      
   
   }

}

'Java' 카테고리의 다른 글

[Java] 오버로딩이란?  (0) 2022.08.02
생성자  (0) 2022.08.02
JVM  (0) 2022.07.29
문법 : 메서드  (0) 2022.07.29
문법 : Class  (0) 2022.07.29
Comments