[내부 정렬] 2: 반절 삽입 정렬 (binary insertion sorting) 실현 (소스 코드)
2144 단어 데이터 구조알고리즘절반 으로 나누다반절 기 삽입 정렬
반절 삽입 정렬 알고리즘 사상
n 개의 정렬 을 기다 리 는 요 소 를 하나의 질서 표 와 하나의 무질서 표 로 보고 시작 할 때 질서 표 에는 하나의 요소 만 포함 되 어 있 으 며 무질서 표 에는 n - 1 개의 요소 가 포함 되 어 있 으 며 정렬 과정 에서 매번 무질서 표 에서
첫 번 째 요 소 를 꺼 내 질서 표 의 적당 한 위치 에 삽입 하여 새로운 질서 표 로 만 들 고 n - 1 회 반복 하면 정렬 과정 을 완성 할 수 있 습 니 다.
a [i] 를 a [0], a [1],..., a [i - 1] 질서 표 에 삽입 하 는 구체 적 인 실시 과정 은 다음 과 같다.
새로운 요 소 를 정렬 된 배열 에 삽입 하 는 과정 에서 삽입 점 을 찾 을 때 삽입 할 구역 의 첫 번 째 요 소 를 a [low] 로 설정 하고 마지막 요 소 를 a [high] 로 설정 하면 한 번 비교 할 때 삽입 할 요 소 를 a [m] 와 비교 합 니 다. 그 중에서 m = (low + high) / 2 를 비교 합 니 다. 시험 에 참가 할 요소 보다 크 면 a [low] 에서 a [m - 1] 를 새로운 삽입 구역 (즉, high = m - 1) 으로 선택 합 니 다. 그렇지 않 으 면 a [m + 1] 에서 a 를 선택 합 니 다.[high] 는 새로운 삽입 영역 (즉 low = m + 1) 입 니 다. low < = high 가 성립 되 지 않 을 때 까지 이 위치 에 있 는 모든 요 소 를 한 자리 뒤로 옮 기 고 새로운 요 소 를 a [high + 1] 에 삽입 합 니 다.
안정성 및 복잡 도
반절 삽입 정렬 알고리즘 은 안정 적 인 정렬 알고리즘 으로 직접 삽입 알고리즘 보다 키워드 간 비교 횟수 를 현저히 줄 였 기 때문에 직접 삽입 정렬 알고리즘 보다 속도 가 빠 르 지만 이동 횟수 를 기록 하 는 것 은 변 하지 않 았 기 때문에 반절 삽입 정렬 알고리즘 의 시간 복잡 도 는 여전히 O (n ^ 2) 로 정렬 알고리즘 을 직접 삽입 하 는 것 과 같 습 니 다. 추가 공간 O (1).
알고리즘 구현 코드:
void binary_insertion_sort(int *a,int n)
{
int i;
// 1
for(i=1;i<n;i++)
{
int low=0;
int high=i-1;
int temp=a[i]; //temp
//
while (low<=high)
{
int mid=(low+high)/2;
if (temp<a[mid])
high=mid-1;
else
low=mid+1;
}
// low=high+1, low temp
// low i
int j;
for (j=i;j>low;j--)
{
a[j]=a[j-1];
}
// temp low
a[low]=temp;
}
}
참고:
http://www.cnblogs.com/java-class/archive/2013/06/01/3112461.html
http://blog.csdn.net/ns_code/article/details/20043459
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.