본문 바로가기
공부/알고리즘

정렬 - 삽입, 퀵, 병합

by 미네밍 2016. 11. 12.

[코드]



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class SortTest {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        final int nums[] = { 255371611159154819 };
 
        Sorting s = new Sorting();
 
        
        s.Insert(nums);
        s.Quick(nums, 0, nums.length - 1);
        s.Merge(nums, 0, nums.length - 1);
    }
 
}
cs


Sort Test 메인 클래스를 하나 만들고, 차례대로 삽입, 퀵, 머지정렬 함수를 호출했다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
class Sorting {
 
    int list[] = new int[10];
    static int count = 0;
 
    public void Insert(int nums[]) {
 
        System.arraycopy(nums, 0, list, 0, nums.length);
        
        System.out.println("----------- insertion sort ------------");
        PrintResult(list); //원래 배열 출력
        InsertSorting(list); //소팅
        
        
        System.out.println(); // 결과출력
        PrintResult(list); // 결과 출력
        System.out.println("Total number of comparison = " + count);
        count = 0;
    }
 
    public void Merge(int nums[], int s, int e) {
        
        System.arraycopy(nums, 0, list, 0, nums.length);
        
        System.out.println("----------- merge sort ----------------");
        PrintResult(list);
        MergeSorting(list, s, e);
        
        
        System.out.println();
        PrintResult(list);
        System.out.println("Total number of comparison = " + count);
        count = 0;
    }
 
    public void Quick(int nums[], int s, int e) {
        
        System.arraycopy(nums, 0, list, 0, nums.length);
        
        System.out.println("----------- quick sort ----------------");
        PrintResult(list);
        QuickSorting(list, s, e);
        
        
        System.out.println();
        PrintResult(list);
        System.out.println("Total number of comparison = " + count);
        count = 0;
    }
 
    public static void InsertSorting(int nums[]) {
 
        for (int i = 1; i < nums.length; i++) {
            int pivot = nums[i];
            for (int j = i - 1; j >= 0; j--) {
                if (pivot < nums[j]) { // pivot 이 비교값보다 작을때에는 뒤로 밀어주기
                    count++;
                    nums[j + 1= nums[j];
                    if (j == 0)
                        nums[j] = pivot;
                } else { // pivot 이 비교값보다 클때에는 바로 뒤에 삽입하기
                    nums[j + 1= pivot;
                    break;
                }
            }
 
            for (int j = 0; j < nums.length; j++)
                System.out.printf("%4d", nums[j]);
            System.out.println();
        }
 
    }
 
    public static void QuickSorting(int nums[], int s, int e) {
 
        if (s < e) {
 
            int mid = partition(nums, s, e); // Partition
 
            // 파티션 후 중간 출력
            for (int k = 0; k < nums.length; k++) {
                if (k < s || k > e)
                    System.out.print("    ");
                else {
                    System.out.printf("%4d", nums[k]);
                }
            }
            System.out.println();
            if (mid != -1) {
                QuickSorting(nums, s, mid - 1); // 왼쪽 정렬
                QuickSorting(nums, mid + 1, e); // 오른쪽 정렬
            }
        }
    }
 
    public static int partition(int nums[], int s, int e) {
 
        // s : 배열 시작
        // e : 배열 끝
        int pivot = nums[s];
        int low = s + 1;
        int high = e;
 
        while (low <= high) { // low 보다 high가 작거나 같을때 반복
            while (pivot > nums[low]) { // 왼쪽부터 비교
                count++;
                low++;
            }
            while (pivot < nums[high]) { // 오른쪽 비교
                count++;
                high--;
            }
 
            if (low <= high) { // low 번째 값과 high 번째 값을 바꿔주기
                int temp = nums[low];
                nums[low] = nums[high];
                nums[high] = temp;
                low++;
                high--;
            }
        }
 
        // 마무리로 high 번째와 pivot 의 자리를 교체한 후, 현재 pivot 이 들어간 자리를 return 해준다.
        int temp = nums[high];
        nums[high] = nums[s];
        nums[s] = temp;
        return high;
    }
 
    public static void MergeSorting(int nums[], int s, int e) {
 
        if (s < e) { // 시작점이 끝나는점보다 작을때만 수행해야하고
 
            int mid = (s + e) / 2;
            MergeSorting(nums, s, mid);
            MergeSorting(nums, mid + 1, e);
            Merging(nums, s, mid, e);
 
        }
    }
 
    public static void Merging(int nums[], int s, int mid, int e) {
 
        int tmp[] = new int[e + 1]; // 임시배열 만들어주기
 
        int i = s; // 앞배열 첫부분
        int j = mid + 1// 뒷배열의 첫부분
        int t = 0;
 
        while (i <= mid && j <= e) {
            count++;
            if (nums[i] <= nums[j])
                tmp[t++= nums[i++];
            else
                tmp[t++= nums[j++];
        }
 
        while (i <= mid)
            tmp[t++= nums[i++];
        while (j <= e)
            tmp[t++= nums[j++];
 
        i = s;
        t = 0;
        while (i <= e) {
            nums[i++= tmp[t++];
        }
 
        for (int k = 0; k <= e; k++) {
            if (k < s || k > e)
                System.out.print("    ");
            else {
                System.out.printf("%4d", nums[k]);
            }
        }
        System.out.println();
 
    }
 
    public static void PrintResult(int nums[]) {
 
        
        for (int j = 0; j < nums.length; j++)
            System.out.printf("%4d", nums[j]);
        System.out.println();
 
    }
}
 
cs



printf 함수는, 매일 댓글을 달아주시는 이웃님의 코드에서 배웠따 핳. 공백 똑같이 해주는거 써본적이 없었는데 신세계!


그리고, 또 배열복사를 몰라서 ㅋㅋㅋ...이것도 이웃님의 코드에서 배웠다 ㅠㅠ 진짜 내가 왜 여태껏 한번도 안써봤는지 모르겠지만... JAVA 다시 공부해야 될 듯 ㅜㅜ


학교 전공책도 찾아보고 했는데 머리에 잘 안들어왔다 ㅠ_ㅠ

이해하고 짜긴했지만 내일 되면 왠지 또 사라질 것 같은 예감ㅋㅋㅋ


[결과창]





결과는 잘 나왔다! ㅎㅎ 졸려...이만 자야지 ㅠ_ㅠ

'공부 > 알고리즘' 카테고리의 다른 글

백준11403_경로찾기  (1) 2016.11.18
백준1927_최소힙  (0) 2016.11.15
백준2252_줄 세우기  (0) 2016.11.08
백준1620_나는야 포켓몬 마스터 이다솜  (1) 2016.11.04
백준1991_트리  (1) 2016.11.02

댓글