통 정렬 (Bucketsert) 사상 과 실현
2183 단어 정렬 알고리즘
(1) 통 정렬 사상
통 정렬 의 사상 은 먼저 배열 을 한 번 훑 어보 고 배열 에서 가장 큰 요 소 를 찾 아 가장 큰 요 소 를 Max 라 고 가정 하 는 것 이다.그리고 맥 스 + 1 개의 '통' 을 정의 합 니 다. '대기 열' 이나 '창고' 로 정의 할 수 있 습 니 다.그 다음 에 배열 을 한 번 더 옮 겨 다 니 며 요소 값 이 i 인 요 소 를 i 번 째 통 에 넣 습 니 다.마지막 으로 0 번 째 통 부터 옮 겨 다 니 며 통 에 있 는 요 소 를 기 존 배열 에 순서대로 넣 고 맥 스 통 까지 옮 겨 다 닐 때 까지 한다.
이 를 통 해 알 수 있 듯 이 통 정렬 의 목적 은 메모리 공간 을 확대 하 는 대가 로 시간의 복잡 도 를 줄 이 는 것 이다.그러나 만약 에 배열 의 요소 가 매우 적 고 배열 의 중간 값 이 가장 큰 요소 가 매우 클 때 이런 알고리즘 을 사용 하면 시간 복잡 도 를 줄 일 수 없 기 때문에 실제 적 으로 이런 정렬 알고리즘 을 사용 하지 않 는 다.또한 부동 소수점 데이터 에 있어 서 이러한 알고리즘 은 통 의 아래 표 시 를 찾 지 않 는 한 (통 의 아래 표 시 는 정형 이기 때 문) 과 수치 정밀도 의 매 핑 관 계 를 찾 지 않 는 한 매우 적합 하지 않다.통 정렬 을 바탕 으로 이 알고리즘 을 개선 하여 '기수 정렬' 이 생 겼 다. 독자 가 '기수 정렬' 사상 을 알 고 싶 으 면 여 기 를 클릭 할 수 있다.
(2) 통 정렬 의 실현
이번 정렬 알고리즘 은 C + + 모드 프로 그래 밍 으로 이 루어 집 니 다.
#include
#include
#include
using std::cout;
using std::endl;
using std::ostream_iterator;
using std::queue;
template
void PrintArr(T (&arr)[N])
{
copy(arr,arr+N,ostream_iterator(cout," "));
cout << endl;
}
template
void BucketSort(T (&arr)[N])
{
size_t i(0),j(0),max(arr[0]);
while(i < N) {
if(arr[i] > max) {
max = arr[i];
}
i++;
}
queue buckets[max+1];
i = 0;
while(i < N) {
buckets[arr[i]].push(arr[i]);
i++;
}
i = 0;
while(i <= max) {
while(!buckets[i].empty()) {
arr[j] = buckets[i].front();
buckets[i].pop();
j++;
}
i++;
}
}
int main()
{
int arr[]= {2,1,5,3,2,6,1,1,8,4,7};
cout << "The init:" << endl;
PrintArr(arr);
cout << "The sort:" << endl;
BucketSort(arr);
PrintArr(arr);
cout << "The final:" << endl;
PrintArr(arr);
}
원본 배열: 2 1 5 3 2 6 1 1 8 4 7
프로그램 실행 결과: 1 1 1 2 2 3 4 5 6 7 8
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WEEK. 01 2022.04.03 TIL정렬(sorting)이란 이름, 학번, 학점 등의 키(key)를 항목값의 대소 관계에 따라 데이터 집합을 일정한 순서로 바꾸어 늘어놓는 작업을 의미함. 정렬 알고리즘은 안정적인 알고리즘과 그렇지 않은 알고리즘으로 나...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.