整列(Sort)-3
お尻の位置合わせ
heap sortはheapツリー構造を用いてソートする方式であり、O(N x logN)
の時間的複雑さを有する.空のアレイは必要ないため、マージ・ソートよりもメモリが少なくなります.
お尻のソート前に理解しなければならない完全なバイナリツリーとお尻について説明します.
バイナリツリーとは?
バイナリツリー(Binary Tree)とは、各ノードにデータを配置し、2つのノードをそれぞれ貼り付ける構造で、無条件に2つのサブノードを持つ.
完全なバイナリツリーとは、ルートの左側のサブノードから右側のサブノードまで、真ん中が空ではなく埋め込まれた構造を指します.
お尻って何?
hop(heap)は、完全バイナリツリーに基づいて、hop生成アルゴリズム(heapify algorithm)によってデータ順序を変更するツリーである.
O(logN)
である.ステージ
次の例では、お尻の位置合わせの手順を示します.
インプリメンテーション
#include <stdio.h>
int number = 9;
int arr[] = {7, 6, 5, 8, 3, 5, 9, 1, 6};
int main(void) {
// 힙 생성
for (int i=1; i<number; i++) {
int c = i;
do {
int root = (c - 1) / 2; // 부모 인덱스를 가리킨다.
if (arr[root] < arr[c]) { // 부모보다 값이 크면 값을 교환
int temp = arr[root];
arr[root] = arr[c];
arr[c] = temp;
}
c = root;
} while(c != 0);
}
// 힙을 재차 구성하고 힙의 크기를 1 감소
for (int i = number-1; i>=0; i--) { // 가장 큰 값인 루트을 맨뒤로 보낸다(제외시킴)
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
int root = 0;
int c = 1;
do {
c = 2 * root + 1;
// 자식 중에 더 큰 값 찾기
if (c < i-1 && arr[c]< arr[c+1]) {
c++;
}
// 루트보다 자식의 값이 크면 교환
if (c < i && arr[root]< arr[c]) {
int temp = arr[root];
arr[root] = arr[c];
arr[c] = temp;
}
root = c;
} while(c < 1);
}
for (int i=0; i < number; i++) {
printf("%d ", arr[i]);
}
return 0;
}
ソート数
カウントソート(Counting Sort)は、10 이하의 정수
のような所定の範囲で最も速いソートアルゴリズムであり、時間的複雑さはO(N)
である.
ステージ
各
インプリメンテーション
#include <stdio.h>
int main(void) {
int temp;
int count[6];
int array[30] = {1, 3, 2, 4, 3, 2, 5, 3, 1, 2,
3, 4, 4, 3, 5, 1, 2, 3, 5, 2,
3, 1, 4, 3, 5, 1, 2, 1, 1, 1};
for (int i=1; i <= 5; i++) {
count[i] = 0;
}
for (int i=0; i<30; i++) {
count[array[i]]++;
}
for (int i=1; i<=5; i++) {
if (count[i] != 0) {
for (int j=0; j<count[i]; j++) {
printf("%d ", i);
}
}
}
return 0;
}
Reference
この問題について(整列(Sort)-3), 我々は、より多くの情報をここで見つけました https://velog.io/@leo-xee/정렬Sort-3テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol