알고보면코딩천재
java 배열과 정렬 (버블정렬) 본문
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