정렬 알고리즘 면접 문제 (상)
13725 단어 데이터 구조
정렬 기본 사상 삽입: 모든 단계 에서 정렬 할 요 소 를 정렬 코드 의 크기 에 따라 앞 에 정렬 된 요소 의 적당 한 위치 에 삽입 하고 요소 가 모두 꽂 힐 때 까지 합 니 다.i (i > = 1) 개 요 소 를 삽입 할 때 앞의 array [0], array [1],...................................................................정렬 알고리즘 을 직접 삽입 하 는 시간 효율 이 높 을 수록 가장 좋 은 경우: 시간 효율 이 O (n) 최 악의 경우: 시간 복잡 도 는 O (n ^ 2) 공간 복잡 도: O (1) 이 고 안정 적 인 정렬 알고리즘 입 니 다.
void InsertSort(DataType *a, size_t n)//
{
for (size_t i = 0; i1; i++)// n-1;
{
DataType end=i;
DataType tmp = a[end + 1];
while (end >= 0 && a[end]>tmp)// ,
{
a[end + 1] = a[end];// end
end--;//
}
a[end + 1] = tmp;//
}
}
2. 힐 정렬:
축소 증 량 정렬 이 라 고도 하 는데 직접 삽입 정렬 에 대한 최적화 1) 예비 정렬 이다.2) 정렬 을 직접 삽입 하면 데이터 양 이 너무 많은 상황 에서 효율 을 높 일 수 있다.
void XiErSort(DataType*a, size_t n)// / ,
{
int flag=3;
while (flag > 1)
{
flag = flag / 3 + 1;// ,flag=1
for (size_t i = 0; iend = i;
int tmp = a[end + flag];
while (end >= 0 && a[end] > tmp)// ,
{
a[end + flag] = a[end];
end -= flag;
}
a[end + flag] = tmp;
}
/*printf(" :");
for (size_t i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
printf("
");*///
}
}
> 3. 쌓 기 정렬
쌓 아 올 리 는 방법 으로 정렬 하 다.1) 작은 무 더 기 를 만 든 다음 에 위로 조정 하거나 아래로 조정 하 는 알고리즘 을 통 해 가장 작은 숫자 를 선택 한 다음 에 마지막 숫자 로 첫 번 째 숫자 를 덮어 쓰 고 아래로 조정 하 는 알고리즘 을 순서대로 작은 것 을 선택 하여 최종 적 으로 정렬 2) 큰 무 더 기 를 만 드 는 것 과 같다.시간 복잡 도 o (n * logn);공간 복잡 도 o (1);
더미 만 들 기: 오름차 순 - > 큰 더미, 내림차 순 - > 작은 더 미 는 다음 과 같은 절 차 를 수행 합 니 다. 배열 이 비어 있 을 때 까지 array [0] 요소 와 현재 가장 쌓 인 마지막 요소 교환 더미 요소 의 개 수 를 1 로 줄 입 니 다. 첫 번 째 단계 후 뿌리 노드 가 가장 쌓 인 정 의 를 만족 시 키 지 않 기 때문에 뿌리 노드 를 아래로 조정 하여 전체 이 진 트 리 를 더미 로 조정 합 니 다.그리고 매번 에 쌓 인 요 소 를 교환 한 후에 조정 하 는 시간 복잡 도 는 모두 O (logn) 이기 때문에 쌓 인 정렬 시간 복잡 도 는 O (n * logn) 쌓 인 정렬 이 불안정 한 정렬 알고리즘 입 니 다.
void Adjustdown(DataType*a, size_t n, int parent)//
{
assert(a);
int child = 2 * parent + 1;
while (childif (a[child + 1] < a[child] && (child + 1) < n)// //
{
++child;//
}
if (a[child]<a[parent])
{
Swap(&a[child], &a[parent]);
parent = child;
child = 2 * parent + 1;
}
else
{
break;
}
}
}
void HeapSort(DataType*a, size_t n)//
{
assert(a);
for (int i = (n - 2) >> 1; i>=0 ;i--)
{
Adjustdown(a, n, i);
}
while (n>0)
{
printf("%d ", a[0]);
a[0] = a[n-1];
n--;
Adjustdown(a, n, 0);
}
}
4. 정렬 선택:
매번 (i 번, i = 0, 1,..., n - 2) 뒤에 n - i 정렬 할 데이터 요소 집합 에서 키 코드 가 가장 작은 데이터 요 소 를 선택 하여 질서 있 는 요소 서열 의 i 번 째 요소 로 합 니 다.n - 2 번 이 끝 날 때 까지 정렬 요소 집합 에 1 개의 요소 만 남 았 습 니 다. 정렬 이 끝 날 때 까지 요소 집합 array [i] – array [n - 1] 에서 키 코드 가 가장 큰 (작은) 데이터 요 소 를 선택 하 십시오. 이 요소 의 마지막 (첫 번 째) 요소 가 아니라면 이 요소 의 마지막 (첫 번 째) 요소 와 나머지 array [i] – array [n - 2] (array [+ 1]– array [n - 1] 집합 에서 상기 절 차 를 반복 하고 나머지 1 개 요 소 를 집합 하여 정렬 하 는 시간 복잡 도 를 O (n ^ 2) 로 직접 선택 할 때 까지 합 니 다.그것 은 불안정한 정렬 알고리즘 이다
void SelectSort(DataType*a, size_t n)
{
int i = 0;
int min = 0;
int j = 0;
for (i = 0; i < n - 1; i++)
{
min = i;// min
for (j = i; j < n; j++)
{
if (a[min]>a[j])//
min = j;
}
if (min != i)
{
Swap(&a[min], &a[i]);
}
}
5. 거품 정렬:
거품 정렬 법 이란 한 그룹의 숫자 를 큰 것 에서 작은 것 으로 정렬 하거나 작은 것 에서 큰 것 으로 정렬 하 는 알고리즘 이다.구체 적 인 방법 은 인접 수치 두 개 를 교환 하 는 것 이다.첫 번 째 수치 부터 인접 한 두 수의 배열 순서 가 우리 의 기대 와 다 르 면 두 수의 위 치 를 교환 합 니 다 (대조).만약 그것 이 우리 의 기대 와 일치한다 면 교환 할 필요 가 없다.이러한 과정 을 반복 하면 마지막 에 수치 가 교환 되 지 않 을 때 까지 정렬 이 완 료 됩 니 다.일반적으로 N 개 수 를 정렬 해 야 할 경우 (N - 1) 번 거품 을 일 으 켜 야 한다.
void BubberSort(DataType*a, size_t n)
{
int i = 0;
int j = 0;
for (i = 0; i < n-1; i++)
{
for ( j = 0; j< n-1-i; j++)
{
if (a[j+1]1], &a[j]);
}
}
}
}
테스트 코드:
#include"sort.h"
void InsertTest()
{
int a[10] = { 2, 4, 5, 9, 3, 6, 8, 7, 1, 0 };
InsertSort(a, sizeof(a) / sizeof(a[0]));
SortPrint(a, sizeof(a) / sizeof(a[0]));
}
void XiErTest()
{
int a[10] = { 9,8,7,6,5,4,3,2,1,0};
XiErSort(a, sizeof(a) / sizeof(a[0]));
SortPrint(a, sizeof(a) / sizeof(a[0]));
}
void HeapSorttest()
{
int a[10] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
HeapSort(a, sizeof(a) / sizeof(a[0]));
}
void SelectSortTest()
{
int a[10] = { 1, 8, 7, 6,0,5, 4, 3, 2, 9};
SelectSort(a, sizeof(a) / sizeof(a[0]));
SortPrint(a, sizeof(a) / sizeof(a[0]));
}
void BubberSortTest()
{
int a[10] = { 1, 8, 7, 6, 0, 5, 4, 3, 2, 9 };
BubberSort(a, sizeof(a) / sizeof(a[0]));
SortPrint(a, sizeof(a) / sizeof(a[0]));
}
int main()
{
/*InsertTest();*/
//XiErTest();
//HeapSorttest();
SelectSortTest();
/*BubberSortTest();*/
system("pause");
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.