한 걸음 한 걸음 쓰기 알고리즘 (기수 정렬)
기수 정렬 은 다른 비교적 특색 있 는 정렬 방식 인 데 어떻게 정렬 합 니까?우 리 는 아래 의 숫자 에 따라 설명 할 수 있다. 12, 104, 13, 7, 9.
(1) 한 자릿수 순 서 는 12, 13, 104, 7, 9 이다.
(2) 10 위 에 따라 104, 7, 9, 12, 13 순 으로 정렬
(3) 백 자리 순 으로 7, 9, 12, 13, 104
여기 서 주의 하 세 요. 만약 에 한 사람의 숫자 가 같다 면 정렬 결 과 는 지난 라운드 의 배열 에 따라 확정 해 야 합 니 다. 예 를 들 어 07 과 09 는 10 분 에 0 이지 만 지난 라운드 에서 정렬 할 때 09 는 07 뒤에 있 습 니 다.마찬가지 로 예 를 들 어 12 와 13 은 10 분 에 1 이지 만 지난 라운드 12 는 13 앞 에 있 었 기 때문에 10 분 에 정렬 할 때 12 도 13 앞 에 서 야 했다.
그래서 일반적으로 10 기수 정렬 알고리즘 은 이렇게 해 야 합 니까?
(1) 데이터 가 여러분 의 크기 를 판단 하고 데 이 터 를 배열 합 니 다.
(2) 1 의 결과 에 따라 데이터 가 10 분 의 크기 에 있 는 지 판단 하고 데 이 터 를 배열 한다.만약 데이터 가 이 위치 에 있 는 나머지 가 같다 면 데이터 간 의 순 서 는 지난 라운드 의 배열 순서에 따라 확정 된다.
(3) 순서대로 유추 하여 데이터 가 100%, 1000% 에 있 는 지 계속 판단 합 니 다.....................................................................
이렇게 많아여러분 들 이 직접 해 보 셨 으 면 좋 겠 습 니 다.
a) 특정한 위치 에 계 산 된 데이터
int pre_process_data(int array[], int length, int weight)
{
int index ;
int value = 1;
for(index = 0; index < weight; index++)
value *= 10;
for(index = 0; index < length; index ++)
array[index] = array[index] % value /(value /10);
for(index = 0; index < length; index ++)
if(0 != array[index])
return 1;
return 0;
}
b) 특정한 위치 에 있 는 데 이 터 를 0 ~ 10 으로 정렬 합 니 다.
void sort_for_basic_number(int array[], int length, int swap[])
{
int index;
int basic;
int total = 0;
for(basic = -9; basic < 10; basic++){
for(index = 0; index < length; index++){
if(-10 != array[index] && basic == array[index] ){
swap[total ++] = array[index];
array[index] = -10;
}
}
}
memmove(array, swap, sizeof(int) * length);
}
c) b 의 정렬 결과 에 따라 실제 데 이 터 를 정렬 한다.
void sort_data_by_basic_number(int array[], int data[], int swap[], int length, int weight)
{
int index ;
int outer;
int inner;
int value = 1;
for(index = 0; index < weight; index++)
value *= 10;
for(outer = 0; outer < length; outer++){
for(inner = 0; inner < length; inner++){
if(-10 != array[inner] && data[outer]==(array[inner] % value /(value/10))){
swap[outer] = array[inner];
array[inner] = -10;
break;
}
}
}
memmove(array, swap, sizeof(int) * length);
return;
}
d) a, b, c 를 조합 하여 기수 정렬 을 구성 하여 특정한 분 위의 데이터 가 0 일 때 까지 한다.
void radix_sort(int array[], int length)
{
int* pData;
int weight = 1;
int count;
int* swap;
if(NULL == array || 0 == length)
return;
pData = (int*)malloc(sizeof(int) * length);
assert(NULL != pData);
memmove(pData, array, length * sizeof(int));
swap = (int*)malloc(sizeof(int) * length);
assert(NULL != swap);
while(1){
count = pre_process_data(pData, length, weight);
if(!count)
break;
sort_for_basic_number(pData, length, swap);
sort_data_by_basic_number(array, pData, swap, length, weight);
memmove(pData, array, length * sizeof(int));
weight ++;
}
free(pData);
free(swap);
return;
}
요약:
(1) 테스트 시 음수 에 주의
(2) 만약 에 특정한 데이터 가 같다 면 이전 데이터 정렬 의 상황 을 고려 해 야 한다.
(3) 코드 에서 여러 번 작은 공간 을 분배 하 는데 이 코드 는 최적화 되 어야 합 니 다.
보충:
(1) 10 월 15 일 저녁 에 나머지 수치 범 위 를 수정 하면 마이너스 도 정렬 에 참가 할 수 있다.
(2) 10 월 16 일 오전 에 swap 메모리 분 배 를 추가 하여 메모리 의 중복 분배 와 방출 을 피 했다.
(3) 10 월 16 일 오전 count 계 수 를 삭 제 했 습 니 다. 0 이 아 닌 데이터 가 발견 되면 1 로 되 돌아 갑 니 다. 모든 데 이 터 를 옮 겨 다 닐 필요 가 없습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.