정렬 알고리즘 (3) 정렬 직접 삽입
1. 정렬 알고리즘 (Straight Insertion Sort) 을 직접 삽입 하 는 기본 동작 은 하나의 기록 을 정렬 된 질서 표 에 삽입 하여 새로운 기록 수 에 하 나 를 추가 하 는 질서 표를 얻 는 것 입 니 다.그것 은 정렬 을 삽입 하 는 방법 에 속한다.
2. 다음 과 같은 코드 를 실현 합 니 다.
#include <stdio.h>
//
typedef int RecordType;
/**
* i j
*/
void Swap(RecordType *rs, int i, int j)
{
RecordType tmp = *(rs + i);
*(rs + i) = *(rs + j);
*(rs + j) = tmp;
}
/**
*
*/
void PrintRs(RecordType rs[])
{
int i, count = rs[0];
for (i = 1; i <= count; i++)
{
printf("%d ", rs[i]);
}
printf("
");
}
/**
*
*/
void StraightInsertionSort(RecordType *rs)
{
int i, j, count = rs[0];
for (i = 2; i <= count; i++)
{
if (*(rs + i) < *(rs + i - 1))
{
*rs = *(rs + i); // 0
for (j = i - 1; *(rs + j) > *rs; j--) // j=1 , , , j >= 1
{
*(rs + j + 1) = *(rs + j);
}
*(rs + j + 1) = *rs;
}
}
*rs = count; // 0
}
int main()
{
RecordType rs[] = {5, 1, 5, 3, 2, 4};
printf(" :\t\t");
PrintRs(rs);
StraightInsertionSort(rs);
printf(" , :");
PrintRs(rs);
return 0;
}
3. 시간 복잡 도
공간의 복잡 도 측면 에서 볼 때, 그것 은 기록 의 보조 공간 (아래 표 시 된 0 의 위치) 만 필요 하 다.시간 복잡 도 측면 에서 볼 때 가장 좋 은 상황 은 정렬 할 기록 목록 자체 가 질서 가 있다 는 것 이다. 그러면 n - 1 차 비교 만 할 뿐 이동 하지 않 고 시간 복잡 도 는 O (n) 이다.최 악의 경 우 는 정렬 대기 목록 이 거꾸로 배열 되 어 있 습 니 다. 이때 2 + 3 +... + n = (n + 2) (n - 1) / 2 회 를 비교 해 야 합 니 다. 기 록 된 이동 횟수 는 최대 치 3 + 4 +... + (n + 1) = (n + 4) (n - 1) / 2 회 에 달 합 니 다.따라서 정렬 기록 이 무 작위 라면 확률 이 같은 원칙 에 따라 평균 비교 와 이동 횟수 는 약 (n ^ 2) / 4 회 이 므 로 정렬 알고리즘 을 직접 삽입 하 는 시간 복잡 도 는 O (n ^ 2) 입 니 다.마찬가지 로 O (n ^ 2) 의 시간 복잡 도 입 니 다. 정렬 알고리즘 을 직접 삽입 하 는 것 이 거품 알고리즘 과 정렬 알고리즘 을 간단하게 선택 하 는 것 보다 성능 이 좋 습 니 다.
참고서: 《 큰소리 데이터 구 조 》
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
물체 검출의 평가 지표 IoU의 계산 방법Yolo나 SSD 등 물체 검출에서 평가 지표로 사용되는 IoU에 대해 조사했으므로 정리했습니다. IoU (Intersection over Union)는 두 영역이 얼마나 겹치는지를 나타내는 지표입니다. 두 영역의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.