日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构:堆排序一(heap sort)

發(fā)布時間:2025/6/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构:堆排序一(heap sort) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? ? ? ? ? ? ? ? ? ? ? ? 普通隊列: ? 先進先出, 后進后出

priority queue(優(yōu)先隊列): ? 出隊順序與入隊順序無關(guān); 和優(yōu)先級相關(guān)

?

二叉堆

葉子節(jié)點: ?一棵樹當中沒有子結(jié)點(即度為0)的結(jié)點稱為葉子節(jié)點,簡稱“葉子”

?

??從數(shù)組下標1開始存儲, 最后一個非葉子節(jié)點的索引: count/2

?

?從數(shù)組下標0開始存儲,最后一個非葉子節(jié)點的索引: (count-1)/2

?

? 數(shù)組實現(xiàn)二叉堆

public class MaxHeap {private int count;private int capacaity;private int[] data;public MaxHeap(int capacity){data = new int[capacity+1];this.capacaity = capacity;}public int size(){return count;}boolean isEmpty(){return count == 0 ;}public void insert(int item){if(count+1 > capacaity)return;// 從數(shù)組下標為1的位置開始插入元素data[count+1] = item;count++;shiftUp(count);}// 取出最大的值public int extractMax(){if(count < 1)return -1;int ret = data[1];data[1] = data[count]; // 將最后一個元素放在第一個元素的位置上count--;shiftDown(1);return ret;}private void shiftDown(int k){while(2*k <= count){int j = 2*k; // 在此輪循環(huán)中,data[k]和data[j]交換位置// 判斷是否有右孩子if(j+1<=count && data[j] < data[j+1]){j = j+1;}if(data[k] >= data[j]){break;}int temp = data[k];data[k] = data[j];data[j] = temp;k = j;}}private void shiftUp(int k){while(k > 1 && (data[k/2] < data[k])){int temp = data[k/2];data[k/2] = data[k];data[k] = temp;k = k/2; }}public void printMaxHeap(){for(int i=1; i<=count; i++){System.out.println("下標"+i+" ="+data[i]);}}public static void main(String[] args){MaxHeap maxHeap = new MaxHeap(100);for(int i=0; i<15; i++){maxHeap.insert(i);}System.out.println(maxHeap.size());maxHeap.printMaxHeap();System.out.println(maxHeap.extractMax());maxHeap.printMaxHeap();} }

?

?排序算法的穩(wěn)定性

?

?

?索引堆

package com.heap;/// 索引最大堆 public class IndexMaxHeap {private int count; // 元素個數(shù)private int capacaity; // 元素容量private int[] data; // 存儲數(shù)據(jù)private int[] indexs; // 存儲數(shù)據(jù)的索引public IndexMaxHeap(int capacity){data = new int[capacity+1];indexs = new int[capacity+1];this.capacaity = capacity;}public int size(){return count;}boolean isEmpty(){return count == 0 ;}// 傳入的i對用戶而言,是從0索引開始的public void insert(int i, int item){if(count+1 > capacaity)return;if(i+1 < 1 || i+1 > capacaity)return;// 從數(shù)組下標為1的位置開始插入元素data[i+1] = item;indexs[count+1] = i+1;count++;shiftUp(count);}public int extractMax(){if(count < 1)return -1;int ret = data[indexs[1]];indexs[1] = indexs[count]; count--;shiftDown(1);return ret;}private void shiftDown(int k){while(2*k <= count){int j = 2*k; // 在此輪循環(huán)中,data[k]和data[j]交換位置// 判斷是否有右孩子if(j+1<=count && data[indexs[j]] < data[indexs[j+1]]){j = j+1;}if(data[indexs[k]] >= data[indexs[j]]){break;}int temp = indexs[k];indexs[k] = indexs[j];indexs[j] = temp;k = j;}}private void shiftUp(int k){while(k > 1 && (data[indexs[k/2]] < data[indexs[k]])){int temp = indexs[k/2];indexs[k/2] = indexs[k];indexs[k] = temp;k = k/2; }}public void printMaxHeap(){System.out.println("===");for(int i=1; i<=count; i++){System.out.println("下標"+i+" ="+data[i]);}}public void printMaxIndexHeap(){System.out.println("===");for(int i=1; i<=count; i++){System.out.println("下標"+i+" ="+data[indexs[i]]);}}public static void main(String[] args){IndexMaxHeap maxHeap = new IndexMaxHeap(100);for(int i=0; i<15; i++){maxHeap.insert(i, (int)(Math.random() * 100));}System.out.println(maxHeap.size());maxHeap.printMaxIndexHeap();maxHeap.printMaxHeap();int max = maxHeap.extractMax();System.out.println("max="+max);maxHeap.printMaxIndexHeap(); // System.out.println(maxHeap.extractMax()); // maxHeap.printMaxIndexHeap(); // // // int[] arr = {5,4,10,2,12,7,9}; // maxHeap.printMaxHeap();} }

?

總結(jié)

以上是生活随笔為你收集整理的数据结构:堆排序一(heap sort)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。