계수 정렬 (계수 정렬)
4206 단어 계수 정렬
계수 정렬 (Counting sort) 은 안정 적 인 정렬 알고리즘 이다.계수 정렬 은 추가 배열 C 를 사용 합 니 다. 그 중에서 i 번 째 요 소 는 정렬 대기 배열 A 의 중간 값 이 i 와 같은 요소 의 개수 입 니 다.그리고 배열 C 에 따라 A 의 요 소 를 정확 한 위치 로 배열 합 니 다.
계수 정렬 의 특징
입력 한 요소 가 n 개 0 에서 k 사이 의 정수 일 때 실행 시간 은?Θ(n + k)。계수 정렬 은 비교 정렬 이 아니 라 정렬 속도 가 모든 비교 정렬 알고리즘 보다 빠르다.
계산 에 사용 되 는 배열 C 의 길 이 는 정렬 대기 배열 의 데이터 범위 (정렬 대기 배열 의 최대 값 과 최소 값 의 차이 에 1 을 더 하 는 것 과 같 음) 에 달 려 있 기 때문에 계산 정렬 은 데이터 범위 가 큰 배열 에 많은 시간 과 메모리 가 필요 합 니 다.예 를 들 어 계수 정렬 은 0 에서 100 사이 의 숫자 를 정렬 하 는 가장 좋 은 알고리즘 이지 만 알파벳 순 으로 사람의 이름 을 정렬 하 는 데 적합 하지 않다.그러나 계수 정렬 은 기수 정렬 에 있 는 알고리즘 으로 데이터 범위 가 큰 배열 을 정렬 할 수 있다.
알고리즘 의 절 차 는 다음 과 같다.
In pseudocode, this may be expressed as follows:
''' calculate histogram: '''
# allocate an array Count[0..k] ; THEN
# initialize each array cell to zero ; THEN
for each input item x:
increment Count[key(x)]
''' calculate starting index for each key: '''
total = 0
for i = 0, 1, ... k:
oldCount = Count[i]
Count[i] = total
total = total + oldCount
''' copy inputs into output array in order: '''
# allocate an output array Output[0..n-1] ; THEN
for each input item x:
Output[Count[key(x)]] = x
decrement Count[key(x)]
return Output
After the first for loop, Count[i]
stores the number of items with key equal to i
.After the second for loop, it instead stores the number of items with key less than i
, which is the same as the first index at which an item with key i
should be stored in the output array. Throughout the third loop, Count[i]
always stores the next position in the output array into which an item with key i
should be stored, so each item is moved into its correct position in the output array. The relative order of items with equal keys is preserved here; i.e., this is a stable sort.
내 가 쓴 코드: (최신 수정 2013 - 12 - 12)/*
* :
* huntinux
* 13-12-12
*
*/
#include <stdio.h>
#include <malloc.h>
int find_max(int *a, int n)
{
int i;
int max = a[0];
for(i = 1; i < n; i++){
if(a[i]>max)
max = a[i];
}
return max;
}
void counting_sort(int *a, int n)
{
int *count, *tmparr;
int i;
int size;
size = find_max(a,n); //
size += 1; // 0 , 。
size = size > n ? size : n; // 。
count = malloc(sizeof(int) * size );
if(!count)
perror("malloc");
for(i = 0; i < size; i++)
count[i] = 0;
for(i = 0; i < n; i++)
count[a[i]]++;
for(i = 1; i < size; i++)
count[i] += count[i-1];
tmparr = malloc(sizeof(int) * n);
if(!tmparr)
perror("malloc");
for(i = 0; i < n; i++)
tmparr[i] = 0;
for(i = n-1; i >= 0; i--) // i n-1 , , 。( )
tmparr[--count[a[i]]] = a[i];
for(i = 0; i < n; i++)
a[i] = tmparr[i];
free(count);
free(tmparr);
}
void print_arr(int *a, int n, char *msg)
{
int i;
if(msg)
printf("%s
", msg);
for(i = 0; i < n; i++)
printf("%d\t", a[i]);
printf("
");
}
int main()
{
int a[15] = {8, 4 , 2, 6, 3, 1, 9, 3, 5, 7, 1, 100, 0, 2, 5};
print_arr(a, 15, "before sorting:");
counting_sort(a, 15);
print_arr(a, 15, "after sorting:");
return 0;
}
아래 코드 는 안정 적 인 정렬 을 확보 하 는 관건 입 니 다.for(i = n-1; i >= 0; i--) // i n-1 , , 。( )
tmparr[--count[a[i]]] = a[i];
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Sort ColorsGiven an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.