본문 바로가기

Algorithm/[BOJ] - JAVA

[백준] 1517 : 버블소트 JAVA 풀이

 

처음 문제를 읽었을 때는 쉬워보이는데 정답 비율이 왜 이렇게 낮지?라는 생각이 들었다.

그리고 버블소트로 풀어보니 역시나 시간초과가 나왔다.

버블소트는 시간복잡도가 O(N^2)인데, 최대 500,000개의 수가 주어지니 그럴 만했다.

 

swap횟수는 병합정렬을 하는 과정에 뒤쪽에 있던 인덱스가 앞으로 이동한 만큼 더해주면 된다.

 

import java.io.*;
import java.util.*;
public class Main{
static long cnt = 0;
static long[] sorted;
public static void main(String[] args)throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
long[] arr = new long[n];
sorted = new long[n];
StringTokenizer st = new StringTokenizer(br.readLine()," ");
for(int i=0;i<n;i++){
arr[i] = Long.parseLong(st.nextToken());
}
mergeSort(arr, 0, n-1);
System.out.println(cnt);
}
static void mergeSort(long[] arr,int low, int high){
if(low<high){
int mid =(low+high)/2;
mergeSort(arr, low, mid);
mergeSort(arr, mid+1, high);
merge(arr, low, mid, high);
}
}
static void merge(long[] arr, int low, int mid, int high){
int l = low;
int r = mid+1;
int idx = low;
while(l <= mid && r <= high){
if(arr[l]<=arr[r]){
sorted[idx++] = arr[l++];
}
else{
sorted[idx++] = arr[r++];
cnt += (r-idx);
}
}
while(r<=high){
sorted[idx++] = arr[r++];
}
while(l<=mid){
sorted[idx++] = arr[l++];
}
for(int i=low;i<=high;i++){
arr[i] = sorted[i];
}
}
}