この記事では、Java におけるヒープ ソートとは何ですか?ヒープソートの紹介。困っている友人は参考にしていただければ幸いです。
ヒープ ソートの概要:
ヒープ ソートは 2 つの段階に分けることができます。ヒープ構築フェーズでは、元の配列をヒープに再編成し、次にシンキング ソート フェーズでヒープからすべての要素を順番に削除し、ソート結果を取得します。
1. ヒープの構築、効果的な方法は、sink() シンキング関数を右から左に使用してサブヒープを構築することです。配列の各位置にはサブヒープのルート ノードがあり、ノードの 2 つの子ノードがすでにヒープ内にある場合は、sink() メソッドを呼び出します。ノードはそれらを結合してヒープに保存できます。サイズ 1 のサブヒープは、sink()、つまりシンク操作を必要としないため、スキップできます。シンク操作とフローティング操作については、私が書いた優先キューの記事を参照してください。
2. ヒープのソートでは、最初のステップでヒープを構築します。このヒープでは、ルート ノードが常に最大値を持つノードとなるため、ルート ノードの値を配列の最後の値と交換します。ヒープの構造を維持するには、sink() シンキングを使用するだけです。
具体的なコード実装:
public class PQSort{ public static void main(String[] args){ int[] a = {9,1,7,5,3,9,12,56,21,45}; sort(a); for(int i=0;i<a.length system.out.print public int for>=0;k--){ sink(a,k,N); } //通过不断把堆中最大值放到数组的后面来排序 while(N>0){ exch(a,0,N--); sink(a,0,N); } } //下沉函数 private static void sink(int[] a, int i, int n){ while(2*i+1a[j]) break; exch(a,i,j); i=j; } } //交换函数 private static void exch(int[] a, int i, int j){ int temp = a[i]; a[i] = a[j]; a[j] = temp; } }</a.length>
実行結果:
以上がJavaのヒープソートとは何ですか?ヒープソートの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。