فرز الكومة: استخدام أكوام الجذر الكبيرة
يتم إدخال جميع المصفوفات في الكومة ، ثم يتم إطلاق الكومة من الكومة وإدراجها مرة أخرى في الصفيف من الخلف إلى الأمام ، ويتم طلب الصفيف من صغير إلى كبير.
الطبقة العامة maxheap <t يمتد قابلة للمقارنة <؟ Super t >> {private t [] data ؛ حجم الباحث الخاص ؛ سعة int الخاصة ؛ MaxHeap العام (السعة int) {this.data = (t []) جديدة قابلة للمقارنة [السعة + 1] ؛ الحجم = 0 ؛ this.capacity = السعة ؛ } size int public () {return this.size ؛ } boolean public isempty () {return size == 0 ؛ } public int getCapacity () {return this.capacity ؛ } / ** * RETURN عرض الحد الأقصى للجذر (لا تراه إلا بدون حذف ، مقارنةً بـ popmax) * / public t seekmax () {return data [1] ؛ } مبادلة void العامة (int i ، int j) {if (i! = j) {t temp = data [i] ؛ البيانات [i] = البيانات [j] ؛ البيانات [j] = temp ؛ }} public void insert (t item) {size ++ ؛ البيانات [الحجم] = العنصر ؛ Shiftup (الحجم) ؛ } / ** * @RETURN POP الحد الأقصى للجذر (المنبثقة يعني الحذف ، مقارنة مع SeekMax) * / public t popmax () {swap (1 ، size--) ؛ ShiftDown (1) ؛ إرجاع البيانات [الحجم + 1] ؛ } / ** * param child العلامة السفلية للعقدة الطفل هي الطفل ، وجدول الزاوية السفلي للعقدة الأصل هو الطفل / 2 * / public void shiftup (int child) {بينما (الطفل> 1 && بيانات [طفل] .Compareto (بيانات [child / 2])> 0) {swap (الطفل ، الطفل / 2) ؛ طفل = طفل / 2 ؛ }}/*** param علامة زاوية منخفضة لعنصر في صفيف البيانات* param b علامة الزاوية السفلية لعنصر في صفيف البيانات* return علامة الزاوية السفلية التي يكون العنصر كبيرًا*/private int max (int a ، int b) {if (data [a] .Compareto إرجاع A ؛ // إرجاع A}/*** param علامة زاوية منخفضة لعنصر في صفيف البيانات* param b علامة الزاوية السفلية لعنصر في صفيف البيانات* param c العلامة السفلية لعنصر في مجموعة البيانات* @reghern staren in element in the data array*/private int ، int b ، int c) الأكبر = الحد الأقصى (الأكبر ، ج) ؛ العودة أكبر. }/** * param الأب ، علامة الزاوية السفلية للعقدة الأصل هي الأب ، والجداول الزاوية السفلية من العقدتين الأيسر واليمين هما: الأب * 2 والأب * 2 + 1 */public void shiftDown (int bod) {بينما (صحيح) {int lchild = boad * 2 ؛ من هي علامة الزاوية السفلية للوالد ، العقد اليسرى واليسرى؟ if (lchild> size) {// إذا لم يكن لدى عقدة الأب طفلًا ترك ولا طفلًا يمينًا ؛ } آخر إذا (rchild> size) {// إذا تركت عقدة الأب الطفل فقط ، لا يوجد طفل جديد جديد = max (الأب ، lchild) ؛ } آخر {// إذا كانت عقدة الأب قد تركت على حد سواء الطفل والطفل الأيمن newFather = max (الأب ، lchild ، rchild) ؛ } إذا (newFather == الأب) {// ، فهذا يعني أن الأب أكبر من كلتا العقدتين الفرعيتين ، واسم الجدول هو بالفعل كومة جذر كبيرة ، لذلك ليست هناك حاجة للاستمرار في ضبط العائد ؛ } آخر {// خلاف ذلك ، تحتاج إلى الاستمرار في ضبط الكومة حتى يتم تبديل حالة كومة الجذر الكبيرة (الأب ، جديد) ؛ // قيمة Exchange الأب = newFather ؛ // تحديث قيمة الأب ، والتي تعادل الاستمرار في ضبط shiftDown (newFather)}}} static <t يمتد <t <t يمتد <؟ super t >> void sort (t [] arr) {int len = arr.length ؛ // in-heap maxheap <T> maxheap = جديد maxheap <T> (len) ؛ لـ (int i = 0 ؛ i <len ؛ i ++) {maxheap.insert (arr [i]) ؛ } // out-heap for (int i = len-1 ؛ i> = 0 ؛ i--) {arr [i] = maxheap.popmax () ؛ }} printarr printarr (Object [] arr) {for (object o: arr) {system.out.print (o) ؛ system.out.print ("/t") ؛ } system.out.println () ؛ } الفراغ الثابت العام (سلسلة args []) {integer [] arr = {3 ، 5 ، 1 ، 7 ، 2 ، 9 ، 8 ، 0 ، 4 ، 6} ؛ printarr (arr) ؛ // 3 5 1 7 2 9 8 0 4 6 sort (arr) ؛ printarr (arr) ؛ // 0 1 2 3 4 5 6 7 8 9}}فرز الكومة: قم ببناء الكومة على المصفوفة (أقصى كومة)
الطبقة العامة maxheap <t يمتد قابلة للمقارنة <؟ Super t >> {private t [] data ؛ حجم الباحث الخاص ؛ سعة int الخاصة ؛ maxheap العام (السعة int) {this.capacity = cappy ؛ this.size = 0 ؛ this.data = (t []) جديد قابلة للمقارنة [السعة + 1] ؛ } MaxHeap العام (t [] arr) {// Heapify ، capty heap artry = arr.length ؛ البيانات = (t []) جديد قابلة للمقارنة [السعة + 1] ؛ System.ArrayCopy (ARR ، 0 ، Data ، 1 ، Arr.Length) ؛ الحجم = arr.length ؛ لـ (int i = size / 2 ؛ i> = 1 ؛ i--) {shiftDown (i) ؛ }} public int size () {return this.size ؛ } public int getCapacity () {return this.capacity ؛ } boolean public isempty () {return size == 0 ؛ } public t seekmax () {return data [1] ؛ } مبادلة void العامة (int i ، int j) {if (i! = j) {t temp = data [i] ؛ البيانات [i] = البيانات [j] ؛ البيانات [j] = temp ؛ }} public void insert (t item) {size ++ ؛ البيانات [الحجم] = العنصر ؛ Shiftup (الحجم) ؛ } popmax popmax () {swap (1 ، size--) ؛ ShiftDown (1) ؛ إرجاع البيانات [الحجم + 1] ؛ } public void shiftup (int child) {بينما (child> 1 && data [child] .Compareto (data [child / 2])> 0) {swap (child ، child / 2) ؛ الطفل /= 2 ؛ }}/*** param علامة زاوية منخفضة لعنصر في صفيف البيانات* param b علامة زاوية منخفضة لعنصر في صفيف البيانات* return return أي عنصر أكبر ، علامة الزاوية السفلية التي يكون العنصر أكبر*/private int max (int a ، int b) {if (data [a] .Compareto (data [b]) <0) البيانات [A] عودة كبيرة A ؛ // إرجاع A}}/*** param علامة زاوية منخفضة لعنصر في صفيف البيانات* param b علامة الزاوية السفلية لعنصر في صفيف البيانات* param c علامة الزاوية السفلية لعنصر في مجموعة البيانات* @العلامة السفلية لعنصر أكبر*/private int max (int b ، int c) الأكبر = الحد الأقصى (الأكبر ، ج) ؛ العودة الأكبر ؛ } public void shiftDown (int ald) {بينما (صحيح) {int lchild = الأب * 2 ؛ int rchild = الأب * 2 + 1 ؛ int newFather = الأب ؛ // لا يهم ما إذا تم تعيين المهمة هنا. إذا تم تغيير العائد التالي لكسر ، فيجب تعيينه إذا كان (LCHILD> SIZE) {// إذا لم يكن هناك أطفال يسار واليمين ؛ } آخر إذا (rchild> size) {// إذا لم يكن هناك طفل جديد جديد = max (الأب ، lchild) ؛ } آخر {// إذا كان هناك أطفال يسار واليمين } إذا (newFather == الأب) {// إذا كانت العقدة الأصل الأصلية هي الأكبر من ثلاثة ، فلن تحتاج إلى متابعة عودة الوبر ؛ } آخر {// العقدة الأصل ليست الأكبر ، تبديل الأطفال الأكبر سناً وتستمر في ضبط الأسفل حتى يتم استوفاء كومة الجذر الكبيرة (NewFather ، الأب) ؛ الأب = newFather ؛ // أي ما يعادل shiftDown (NewFather). إذا تبين أن NewFather هو الطفل الأيسر للأب ، فهذا يعادل shiftDown (2*الأب)}}} الثابت العام <t يمتد قابلاً للمقارنة <؟ super t >> void sort (t [] arr) {int len = arr.length ؛ maxheap <T> maxheap = جديد maxheap <> (arr) ؛ لـ (int i = len-1 ؛ i> = 0 ؛ i--) {arr [i] = maxheap.popmax () ؛ }} printarr printarr (Object [] arr) {for (object o: arr) {system.out.print (o) ؛ system.out.print ("/t") ؛ } system.out.println () ؛ } الفراغ الثابت العام (سلسلة args []) {integer [] arr = {3 ، 5 ، 1 ، 7 ، 2 ، 9 ، 8 ، 0 ، 4 ، 6} ؛ printarr (arr) ؛ // 3 5 1 7 2 9 8 0 4 6 sort (arr) ؛ printarr (arr) ؛ // 0 1 2 3 4 5 6 7 8 9}}مثال فرز الكومة أعلاه (تطبيق Array Java) هو كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.