スタックソートJavaコード実装
ヒープのソート
ヒープソート(Heapsort)とは、ヒープというデータ構造を用いて設計されたソートアルゴリズムのことである.スタックは、完全なツリーに近い構造であり、スタックの性質を満たすと同時に、サブノードのキー値またはインデックスが親ノードよりも常に小さい(または大きい)ということである.
アルゴリズムの説明初期並べ替え対象キーワードシーケンス(R 1,R 2.....Rn)を、初期の無秩序領域である大きなトップスタックに構築する. スタックトップ要素R[1]を最後の要素R[n]と交換すると、新しい無秩序領域(R 1,R 2,......Rn−1)と新しい秩序領域(Rn)が得られ、R[1,2...n−1]<=R[n]を満たす. 交換後の新しいスタックトップR[1]はスタックの性質に反する可能性があるため、現在の無秩序領域(R 1,R 2,......Rn−1)を新しいスタックに調整し、再びR[1]を無秩序領域の最後の要素と交換し、新しい無秩序領域(R 1,R 2....Rn−2)と新しい秩序領域(Rn−1,Rn)を得る必要がある.秩序領域の要素個数がn−1になるまで、このプロセスを繰り返し、ソートプロセス全体が完了する.
アルゴリズム解析時間の複雑さ: 最適:T(n)=O(nlogn) 最悪:T(n)=O(nlogn) 平均:T(n)=O(nlogn) 空間複雑度:O(1) 安定性:不安定 コード実装
ヒープソート(Heapsort)とは、ヒープというデータ構造を用いて設計されたソートアルゴリズムのことである.スタックは、完全なツリーに近い構造であり、スタックの性質を満たすと同時に、サブノードのキー値またはインデックスが親ノードよりも常に小さい(または大きい)ということである.
アルゴリズムの説明
アルゴリズム解析
public class HeapSort {
public static void heapSort(int[] arr) {
if (arr == null || arr.length <= 1) return;
// 。
buildHeap(arr);
int len = arr.length;
while (len > 1) {
// 。
swap(arr, 0, len - 1);
// , 。
len--;
// 。
heapfy(arr, 0 , len);
// 。
print(arr);
}
}
private static void buildHeap(int[] arr) {
// :2i + 1 >= arr.length --> i >= (arr.length - 1) / 2
for (int i = (arr.length - 1) / 2 - 1; i >= 0; i--) {
heapfy(arr, i, arr.length);
}
}
// , 。
private static void heapfy(int[] arr, int i, int len) {
while (true) {
int maxPostion = i;
int leftChild = 2 * i + 1; // 。
int rightChild = 2 * i + 2; // 。
// , 。
if (leftChild < len && arr[leftChild] > arr[maxPostion]) {
maxPostion = leftChild;
}
// , 。
if (rightChild < len && arr[rightChild] > arr[maxPostion]) {
maxPostion = rightChild;
}
if (maxPostion == i) {
break; // , 。
} else {
swap(arr, i, maxPostion); // , 。
i = maxPostion;
}
}
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] =temp;
}
public static void main(String[] args) {
int[] arr = {6, 9, 1, 4, 5, 8, 7, 0, 2, 3};
System.out.print(" : ");
print(arr);
heapSort(arr);
System.out.print(" : ");
print(arr);
}
//
public static void print(int[] arr) {
if (arr == null) return;
for(int i : arr) {
System.out.print(i + " ");
}
System.out.println();
}
}
/*
: 6 9 1 4 5 8 7 0 2 3
8 6 7 4 5 1 3 0 2 9
7 6 3 4 5 1 2 0 8 9
6 5 3 4 0 1 2 7 8 9
5 4 3 2 0 1 6 7 8 9
4 2 3 1 0 5 6 7 8 9
3 2 0 1 4 5 6 7 8 9
2 1 0 3 4 5 6 7 8 9
1 0 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
: 0 1 2 3 4 5 6 7 8 9
*/