정렬 알고리즘 (빠 른 정렬, 쌓 기 정렬)
3028 단어 데이터 구조
먼저 하나의 수 (정렬 할 데이터 의 첫 번 째 데이터) 를 비교 기준 으로 선택 한 다음 에 뒤에서 기준 보다 작은 것 을 찾 아 앞쪽 의 빈자리 위치 에 두 었 다. 이 어 예전 에 기준 보다 큰 데 이 터 를 뒤쪽 의 빈자리 위치 에 두 었 다. i 와 j 가 만 날 때 까지 기준 을 i 위치 에 두 었 다. 기준 앞의 데 이 터 는 모두 기준 보다 작고 기준 후의 데 이 터 는 모두 기준 보다 크다.그리고 왼쪽 과 오른쪽 을 재 귀적 으로 처리 합 니 다.
//
typedef struct stack
{
int* data;
int top;
}stack;
int quickonce(int *arr, int left, int right) //O(n)
{
int i = left;
int j = right;
int tmp = arr[i];//
while (i tmp)
{
j--;
}
if (i== j)
{
break;
}
arr[i] = arr[j];
//
while (i < j && arr[i] < tmp)
{
i++;
}
if (i == j)
{
break;
}
arr[j] = arr[i];
}
arr[i] = tmp;
return i;
}
void Quick(int *arr, int left, int right) // O(nlogn) O(logn)
{
int i = left;
int j = right;
int pos = quickonce(arr, i, j);
if (i< pos-1)
{
Quick(arr, i, pos - 1);
}
if (j>pos+1)
{
Quick(arr, pos + 1, j);
}
}
// :
void QuickSort1(int *arr, int len)
{
Quick(arr, 0, len - 1);
}
// , , ,
void QuickSort2(int *arr, int len)
{
stack st;
int left = 0;
int right = len - 1;
int i = left;
int j = right;
int top = 0;
int n = (int)(log10(double(len - 1)) / log10(double(2))) + 1;
st.data = (int *)malloc(2 * sizeof(int)* n);
st.top = 0;
st.data[top++] = i;
st.data[top++] = j;
while (top != 0)
{
j = st.data[--top];
i = st.data[--top];
int pos = quickonce(arr, i, j);
//
if (i < pos-1)
{
st.data[top++] = i;
st.data[top++] = pos - 1;
}
//
if (j > pos+1)
{
st.data[top++] = pos + 1;
st.data[top++] = j;
}
}
free(st.data);
}
여섯, 더미 정렬
큰 뿌리 더미: 한 그루 의 나무 중에서 어떤 나무 든 지 그 아버지의 노드 는 좌우 아이 보다 크다.
생각:
1. 마지막 나무 에서 위로 올 려 야 한다.
2. 조정 할 때마다 하위 트 리 의 뿌리 부분 부터 아래로 조정
// ( ,
// :i :2i+1 :2i+2 i, (i-1)/2
//
//1.
//2.
void AdjustHeap(int *arr, int len, int start)// O(logn)
{
int tmp = arr[start];// ,
int i = start * 2 + 1;//
while (i arr[i])// && >
{
i += 1;
}// , i
if (arr[i] > tmp)
{
arr[start] = arr[i];
start = i;//
i = 2 * start + 1;//
}
else
{
break;
}
}
arr[start] = tmp;
}
//
void CreateHeap(int *arr, int len) //O(n)
{
for (int i = (len-2)/2; i >= 0; i--)//len-1
{
AdjustHeap(arr, len , i);
}
}
void swap(int *a,int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void HeapSort(int *arr, int len) // O(nlogn), O(1),
{
CreateHeap(arr, len); // O(nlogn)
int end = len - 1;//
//while (end > 0)
//{
// swap(&arr[0], &arr[end]);
// AdjustHeap(arr, end, 0);
// end--;
//}
for (int i = 0; i < len; ++i) // O(nlogn)
{
swap(&arr[0], &arr[len - 1 - i]);
AdjustHeap(arr, len-1-i,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에 따라 라이센스가 부여됩니다.