데이터 구조: 정렬(기본)
정렬 알고리즘과 복잡성
연산
복잡성
버블 정렬
오(n2)
선택 정렬
오(n2)
삽입 정렬
오(n2)
쉘 정렬
오(n2)
빠른 정렬
오(n2)
기수 정렬
오(nk)
힙 정렬
O(nlog(n))
병합 정렬
O(nlog(n))
주요 콘텐츠로 이동하기 전에 이러한 모든 정렬 알고리즘이 작동하는 방식을 시각화하는 데 도움이 되는 website을 추천하고 싶습니다. (P.S. 해시 테이블, 바이너리 힙 시각화 등과 같은 다른 작업에도 도움이 됩니다.) 그리고this one도 도움이 됩니다!
버블 정렬
버블 정렬에서는 한 번에 2개의 항목을 비교하고 교환하거나 다음 쌍을 비교하기 위해 이동합니다. 악명 높게 느리지만 개념적으로 가장 간단한 정렬 알고리즘입니다.
크기가 n인 배열을 정렬하는 방법에 대한 유사 코드
1. Repeat i) to ii) for n times
i) Compare the leftmost element in array with the next element
a. If the leftmost element is bigger, swap them
b. Else, go to 2.
ii) Move to next position, set that element to be the leftmost element. Is there next element?
a. Yes, go back to i)
b. No, go back to 1.
2. Done
그리고 여기 버블 정렬의 자바 코드가 있습니다.
public void bubbleSort() {
int out, in, temp;
int[] a = new int[nElems]; // nElems is the number of elements we'll input later ^^||
for(out=nElems-1; out>1; out--) {
for(in=0; in<out; in++) {
if( a[in] > a[in+1] ) { // out of order?
temp = a[in]; // swap them
a[in] = a[in+1];
a[in+1] = temp;
}
}
}
}
버블 정렬의 효율성
비교 작업:
for N items: (N-1) + (N-2) + (N-3) + ... + 1
= N*(N-1)/2
≈ N2/2
교환 작업:
usually less than comparison operations
≈ N2/4
선택 정렬
선택 정렬에서는 데이터를 따라 이동하면서 가장 작은 항목을 선택하고 선택한 항목을 위치 0으로 바꾸는 등의 작업을 수행합니다.
크기 n의 배열에 대한 의사 코드
1. Repeat i) to ii) for (n-1) rounds
i) Go through every unsorted element
ii) Pick the smallest one and swap with element at the first position (but next to those already been sorted)
2. Done
선택 정렬을 위한 자바 코드
public void selectionSort() {
int out, in, min, temp;
int[] a = new int[nElems]; // nElems is the number of elements we'll input later ^^||
for(out=0; out<nElems-1; out++) {
min = out;
for(in = out+1; in<nElems; in++) {
if(a[in] < a[min]) { // if min is greater,
min = in; // we have a new min
temp = a[out]; // swap 'em
a[out] = a[min];
a[min] = temp;
}
}
}
}
선택 정렬의 효율성
비교 작업:
the same as bubble sort
≈ N2/2
교환 작업:
usually less than N
삽입 정렬
데이터를 2개의 목록(정렬된 목록과 정렬되지 않은 목록)으로 나눕니다. 각 반복에서 정렬되지 않은 목록의 첫 번째 요소가 정렬된 목록의 적절한 위치에 삽입됩니다.
의사 코드
1. Repeat i) and ii) for (n-1) rounds
i) insert the first unsorted element, to the sorted
ii) compare the newly inserted element to all the sorted, and put it in place
2. Done
자바 코드!
public void insertionSort() {
int in, out;
int[] a = new int[nElems]; // nElems is the number of elements we'll input later ^^||
for(out=1; out<nElems; out++) { // out is dividing line
long temp = a[out]; // remove marked item
in = out; // start shifts at out
while(in>0 && a[in-1]>=temp) { // until one is smaller,
a[in] = a[in-1]; // shift item to right
--in; // go left one position
}
a[in] = temp; // insert marked item
}
}
선택 정렬의 효율성
비교 작업:
N*(N-1)/4
≈ N2/4
복사 작업:
usually similar to comparison operations
3가지 단순 정렬 비교
초기 데이터 배열과 약간의 추가 메모리만 필요하지만 모든 알고리즘은 O(N2) 시간에 실행됩니다.
비교 횟수가 여전히 높습니다
데이터 양이 적거나 데이터가 거의 정렬되었다고 가정하면 대부분의 상황에서 가장 좋습니다.
Reference
이 문제에 관하여(데이터 구조: 정렬(기본)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/rinsama77/data-structure-sorting-basic-1pkn텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)