버블 & 빈으로 이동합니다: 버킷 정렬이 가장 빠른 정렬입니다!

버킷 정렬 알고리즘은 제품 세계를 우아하게 만드는 최고의 정렬 방법일 수 있으니 클릭하지 마세요.

거창한 주장이라는 것을 알지만 그 이유에 대해 알아보겠습니다.

이 버킷 정렬 문서에서

그렇다면 버킷 정렬 방식이란 무엇인가요?

배열의 데이터를 정렬하고자 한다는 가정 하에 버킷 정렬은 좋은 출발점이 될 수 있습니다. 필요에 적합하다면 더 이상 찾지 마세요. 검색이 끝났습니다!

항목 배열을 정렬하는 방법은 크게 두 가지로, 각 값을 다른 값과 비교하면서 목록을 탐색하여 올바른 순서를 찾거나(버블 정렬), 각 값에 고유한 저장 영역을 지정하여 해당 위치로 이동하는 방법(빈 정렬)이 있습니다.

버킷 정렬은 후자의 방법, 즉 빈 정렬을 사용하여 작동합니다. 버킷 정렬이 왜 그렇게 좋은지 보여드리기 전에 빈 정렬과 어떻게 다른지 자세히 살펴보겠습니다.

자, 10개의 정수가 포함된 배열이 있고 이것이 버킷이라고 가정해 봅시다. 각 버킷의 항목 수 역할을 하는 카운터가 있으므로 시작 시 이 카운터는 배열의 요소 수, 즉 10과 같습니다.

이 배열을 정렬하기 전에 각 버킷을 동일한 값(0에서 9 사이의 정수 값)으로 채워 보겠습니다.

이제 5개의 버킷이 모두 꽉 찼으니 이제 분류로 넘어갈 차례입니다. 각 버킷의 용량을 어떻게 알 수 있을까요? 각 버킷은 현재 그 안에 있는 값의 두 배, 즉 n = 0...9(버킷 10개)인 2n을 저장합니다. 여기서 용량을 두 배로 늘린 이유는 원하는 값이 버킷 안에 있는지 확인하기 위해 한 버킷 안을 들여다보면 1/10의 공간만 차지하기 때문입니다.

예를 들어, 버킷 5에는 8개(8 * 2)의 값이 들어 있고, 그 다음으로 작은 버킷에는 2개(4 * 2)의 값이 들어 있습니다. 이것이 어떻게 두 배로 늘어나는지 보이시나요?

정렬해야 할 첫 번째 값인 5를 살펴보면, 5번 버킷 내부를 살펴보는 데는 용량이 작기 때문에 아주 짧은 시간밖에 걸리지 않는다는 것을 알 수 있습니다. 이제 배열 내에서 34가 어디에 있는지 찾고 싶다고 가정해 보겠습니다. 34번 버킷 내부를 찾는 데는 0.000000001초도 걸리지 않습니다! 그 안에는 100,000개의 값이 있기 때문에 영원히 걸릴 것입니다!

이제 요점을 이해하신 것 같습니다. 이제 버킷 정렬의 대안에 대해 간단히 살펴보겠습니다.

버킷 정렬 알고리즘 기록

그렇다면 이 방법은 언제부터 시작되었을까요? 버킷 정렬은 1955년에 발명된 것으로 알려져 있지만, 이 방법은 적어도 1945년부터 사용되어 왔다는 사실이 나중에 밝혀졌습니다.

1970년대에 주목을 받기 시작했지만 컴퓨터 속도가 본격적으로 발전하기 시작한 1995년까지는 널리 채택되지 않았습니다.

오늘날 버킷 정렬은 병합 정렬과 퀵 정렬에 이어 세 번째로 가장 많이 사용되는 정렬 알고리즘 중 하나가 되었습니다! 일반적으로 구간차원 정렬과 버킷 정렬은 모두 O(n * log(n))이므로 큰 차이가 없어 보일 수 있지만, 데이터가 큰 경우 효율적인 비교 방식 때문에 버킷 정렬을 사용하는 것이 좋습니다.

빈 및 버블 정렬이란 무엇인가요?

빈 정렬에서는 정렬되는 각 값에 대해 별도의 '영역'을 갖는 것이 좋습니다. 다음은 구간차원 정렬 구현의 예입니다:

이 구현은 버킷 정렬보다 빠르지도 않고 시간 복잡성도 버킷 정렬과 거의 비슷하지만, 그 복잡성을 조금만 더 줄일 수 있다면 어떨까요? 물론 가능합니다!

버블 정렬과 버킷 정렬 - 버블 정렬은 이 공식에 어떻게 부합할까요?

버블 정렬을 사용하면 인접한 두 값을 비교하고 필요한 경우 값을 바꾸기만 하면 됩니다(무차별 대입 방식). 버킷 정렬과 유일한 차이점은 버킷의 크기인데, 버블 정렬에서는 버킷의 크기가 모두 동일합니다. 버킷 정렬에서 가장 큰 버킷과 같은 크기로 만들면 버킷 정렬이 됩니다!

버블 정렬과 버킷 정렬 - 버킷 정렬이 더 빠른 이유는 무엇인가요?

간단히 말해서 버블 정렬의 시간 복잡도는 O(n^2)입니다. 버킷 정렬의 시간 복잡도는 버킷 안에 있는 요소를 찾는 데 걸리는 모든 분기, 즉 결국 요소를 찾거나 충분히 깊숙이 들어가지 않을 때까지 모든 버킷 내부를 살펴보는 데 걸리는 시간을 곱하면 알 수 있습니다.

각각 100,000개의 항목이 있는 10개의 버킷에 대해 이 작업을 수행한다면... 글쎄요... 시스템이 오래 지속될 것 같지 않습니다. 빈 정렬이 잘 작동하지 않는 이유도 두 배로 늘어날 뿐만 아니라 기하급수적으로 느려지는 요소가 하나 더 추가되기 때문입니다.

이제 버킷 정렬에 각각 100,000개의 항목이 들어 있는 10개의 버킷을 보관하도록 하면 어떨까요? 이제 버킷 정렬에 얼마나 많은 시간이 걸릴까요? O(n) (선형)!

맞습니다. 100,000개의 정수로 이루어진 배열을 선형 검색하는 것과 마찬가지입니다! 버킷 정렬 알고리즘이 뒤에서 수행하는 모든 분기 및 확인 작업은 '이 정수가 내가 찾고 있는 정수보다 작거나 큰지'로 요약할 수 있으며, 선형 검색을 통해서도 찾을 수 있습니다.

버킷 정렬 빅 O

버킷 정렬 빅 O 표기법은 O(n + n * k)이며, 여기서 n은 배열의 요소 수, k는 버킷 수입니다.

버킷 정렬 시간 복잡성

버킷 정렬의 시간 복잡성은 버킷의 수에 따라 달라집니다. 버킷이 하나인 버킷 정렬은 일정한 시간이 걸리지만, 버킷이 두 개 이상인 버킷 정렬은 각 단계에서 항상 1) 요소가 이미 배치되었는지 확인하고 2) 올바른 위치에 배치하는 두 가지 작업을 수행해야 하므로 실행 시간이 추가됩니다. 이 상수 곱셈 계수의 선택은 데이터 구조를 얼마나 크게 만들 것인지에 따라 달라집니다. 일반적으로 이러한 최적화는 매우 많은 수의 항목에 도달할 때까지는 필요하지 않을 수 있습니다.

버킷 정렬 Java

Java에서 버킷 정렬 알고리즘을 구현하려면 먼저 버킷 데이터 구조를 만들어야 합니다. 적어도 주어진 요소 수만큼의 요소를 담을 수 있는 데이터 구조가 필요합니다. 가장 쉬운 방법은 자동 확장 기능이 있는 배열 목록을 사용하는 것이겠지만, 링크된 목록이나 다른 것을 선호한다면 그것은 여러분의 선택에 달려 있습니다! 여러분만의 정렬 알고리즘을 프로그래밍하는 방법을 알려드리려는 것이 아닙니다...

import java.util.*; class BucketSort { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here List<Integer> arr = new ArrayList<Integer>(); for (int i = 0; i < 100000; i++) { arr.add(i); } Bucket sortBucketSort = new BucketSort(); String bucketName = “”; int[] bucketArray = null; System.out.println(“Please input the number of buckets you would like to use.”); int bucketNumInput = Integer.parseInt( JOptionPane.showInputDialog(“How many buckets do you want?”)); if (bucketNumInput < 1) { JOptionPane.showMessageDialog(null, “Invalid Number”); return; } if (arr == null) { arr = new ArrayList<Integer>(); } bucketArray=new int [bucketNumInput]; for (int i=0; i<bucketNumInput ;i++){ bucketArray [i]=arr.size(); } Arrays.sort(bucketArray); for (int i=0; i<bucketArray.length-1; i++) { bucketName = Integer.toString(bucketArray [i]); System.out.println(“Working on bucket ” + bucketName); // inserts data from array to proper location int j = 0; while (j < arr.size()) { if (arr.get(j) > bucketArray [i+1]) { break; } else if (arr.get(j) <= bucketArray [i+1]) { continue; } else { arr.set(j, bucketArray [i+1]); j++; } } bucketArray [i] = arr.size(); // delete from array } System.out.println(“All done!”); for (int i=0; i<bucketArray.length-1; i++) { System.out.println(“Working on bucket ” + bucketName); System.out .print(bucketName + “, you have ” + arr.get(bucketArray [i])); if (arr.get(bucketArray [i]) != 0) { bucketName = Integer .toString(bucketArray [i]); System.out .print(“Removing ” + bucketName); arr .remove(bucketArray [i]); }

휴! 긴 코드 줄입니다.

버킷 정렬 알고리즘 - 블록에서 가장 빠른 정렬 알고리즘...

이제 버킷 정렬 알고리즘이 무엇인지 알게 되었습니다. 이 알고리즘은 특히 큰 데이터 덩어리를 정렬하는 매우 빠른 방법이며, 특히 인메모리 데이터를 정렬할 때 유용합니다. 버킷 정렬 알고리즘을 사용하면 다른 모든 종류의 정렬 알고리즘으로는 불가능한 100,000개의 정수를 빠르게 정렬할 수 있습니다! 여러분은 어떻게 생각하시나요? 이제부터 빠른 정렬을 위해 이 알고리즘을 사용하시겠습니까?

tl;dv 비즈니스용
tl;dv 는 조직 전체에서 회의에서 가치를 창출할 수 있도록 도와줍니다. 여러분과 조직에 유용한 회의 인사이트를 기록, 전사, 요약, 생성 및 자동화하세요. 몇 분 안에 설정하세요.
무제한 녹화 및 대본
AI 요약
물어보기 tl;dv AI
30개 이상의 언어로 지원
멀티미팅 AI 보고서
+5000개 이상의 통합

tl;dv 블로그

블로그 구독하기

미팅, 영업, Customer Success, 생산성 및 직장 문화에 관한 최신 팁과 뉴스를 구독하고 최신 정보를 받아보세요.