數據結構算法-堆排序

堆排序:利用堆的特性進行排序,先將數組轉換為堆對象(最大堆或最小堆),以最大堆為例,每次heapify之后,取出堆頂(索引為0)的元素與最后一個元素交換。以后每次做同樣的事情,只是堆的長度每次-1,直到1為止(最后一個元素不需要調整)。

堆排序流程

將數組調整為堆模型

我們以最大堆為例,傳入一個無序的數組。先將其調整為堆最大堆模型,也就是最大值在第一個位置(樹的根節點)。

定義數組存儲待排序內容

public class HeapSort {private int[] elements; //堆的數組public HeapSort(int[] elements) {this.elements = elements;}}

定義heapify方法對數組調整大堆結構

  public void heapify(int curr,int size) {//1. 設置當前節點為最大節點int largest = curr;//2. 計算當前節點的左子節點,和右子節點int left = 2 * curr + 1;int right = 2 * curr + 2;// 3.1比較左子節點if (left < size && elements[left] > elements[largest]) {largest = left;}if (right < size && elements[right] > elements[largest]) {largest = right;}//交換largsetif (largest != curr) {int tmp = elements[largest];elements[largest] = elements[curr];elements[curr] = tmp;heapify(largest,size);}}

對數組使用堆排序

所謂堆排序,是我們將每次調整后的最大值(即堆的頂點即第一個元素)和最后一個元素進行調換,然后對除最后一個元素的所有元素繼續按大堆進行調整。

   public void sort() {int len = elements.length;//數組長度每輪減一,將第一個元素移到從后向前的位置。while (len>1) {for(int i = len/2-1;i>=0;i--){heapify(i, len);}swap(0,--len);}}/*** 數組中的元素交換的方法*/ public void swap(int i,int j){int t = elements[i];elements[i] = elements[j];elements[j] = t;}/*** 打印數組元素*/
public void print() {System.out.println(Arrays.toString(this.elements));
}

測試排序

    public static void main(String[] args) {int[] a = {3, 9, 2, 1, 4, 5};System.out.println("init: " + Arrays.toString(a));HeapSort hs = new HeapSort(a);hs.sort();hs.print();}

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/22220.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/22220.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/22220.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Golang性能分析工具pprof--遠程分析時無法定位源代碼行數問題解決方案

場景 通過命令行模式的list命令&#xff0c;為了查看指標消耗在具體哪一行&#xff0c;需要源代碼。但實際程序是部署在線上或者程序的源代碼目錄變了&#xff0c;則pprof從默認路徑找不到代碼&#xff0c;無法顯示是哪一行的問題。 通過瀏覽器模式的source頁面&#xff0c;有…

JUC總結3

CAS 簡介 CAS的全稱是“比較并交換”&#xff0c;是一種無鎖的原子操作&#xff0c;其體現了樂觀所的思想&#xff0c;在無鎖的情況下保證線程操作共享數據的原子性。 CAS一共有3個值&#xff1a; 1、V&#xff1a;要更新的值&#xff1b; 2、E&#xff1a;預期值&#xf…

RHCE (Linux進階) Ubuntu 操作系統安裝教程

一、在官網下載iso鏡像文件 下載地址&#xff1a; https://cn.ubuntu.com/download/server/step1#downloads&#xff08;下載最新的Ubuntu 20.04 LTS服務器版本&#xff09; 二、VMware安裝配置過程 基本安裝過程 1、新建虛擬機 2、選擇典型即可 3、設置下載好的Ubuntu對應路…

Exception異常機制詳細講解

目錄 一、異常1.1 什么是異常1.2 異常機制的作用1.3 常見的異常2.3 異常的分類1. Error2. Exception① 運行時異常② 編譯期異常總結&#xff1a; 二、異常的處理2.1 拋出異常3.1 拋出異常語法3.2 試圖捕獲異常3.3 捕獲異常與拋出異常的區別1. 拋出異常2.捕獲異常 三、finally四…

Spring Cloud:構建高可用分布式系統的利器

摘要&#xff1a;本文將介紹Spring Cloud&#xff0c;一個基于Spring Boot的開源微服務架構工具集。我們將探討Spring Cloud的核心組件、特性以及如何使用Spring Cloud構建高可用、分布式系統。通過本文&#xff0c;讀者將了解到Spring Cloud在實現微服務架構中的應用和優勢。 …

【Springcloud微服務】MybatisPlus下篇

&#x1f525; 本文由 程序喵正在路上 原創&#xff0c;CSDN首發&#xff01; &#x1f496; 系列專欄&#xff1a;Springcloud微服務 &#x1f320; 首發時間&#xff1a;2024年6月4日 &#x1f98b; 歡迎關注&#x1f5b1;點贊&#x1f44d;收藏&#x1f31f;留言&#x1f43…

24、matlab二維和三維網格(meshgrid函數)以及散點數據插值 griddata()函數

1、二維和三維網格(meshgrid函數) 語法 語法1:[X,Y] = meshgrid(x,y) 基于向量 x 和 y 中包含的坐標返回二維網格坐標。 語法2:[X,Y] = meshgrid(x) 與 [X,Y] = meshgrid(x,x) 相同,并返回網格大小為 length(x)length(x) 的方形網格坐標。 語法3:[X,Y,Z] = meshgrid(x,y,…

汽車銷售門店零售價格違規檢查的實踐經驗方法

隨著汽車市場的蓬勃發展&#xff0c;汽車銷售門店的零售價格合規性日益受到業界和消費者的關注。為確保銷售過程的公平與透明&#xff0c;開展零售價格違規檢查顯得尤為重要。 在這方面&#xff0c;深圳神秘顧客&#xff08;SMS&#xff09;公司憑借其深厚的實踐經驗和專業技巧…

弘君資本炒股開戶:如何看待股價波動?

在股票商場上股價的動搖無疑是投資者最為關心的話題之一&#xff0c;面臨股價的起伏不定投資者往往會感到迷茫和焦慮。關于怎么看待股價動搖&#xff0c;弘君資本下面就為大家詳細介紹一下。 股價動搖是股市運行的常態&#xff0c;股市是國民經濟的晴雨表&#xff0c;股票價格…

Flink run 自動化運行任務shell腳本

Linux命令行&#xff1a; sh flink_run.sh test com.dzj.app.base.test.FlinkKafkaOffsetTest /root/soft/test.jar flink_run.sh腳本內容&#xff1a; #!/bin/bash# 檢查參數數量是否正確 if [ "$#" -ne 3 ]; thenecho "錯誤&#xff1a;需要提供 3 個參數&…

SpringBoot+layui實現Excel導入操作

excel導入步驟 第三方插件引入插件 效果圖 &#xff08;方法1&#xff09;代碼實現&#xff08;方法1&#xff09;Html代碼&#xff08; 公共&#xff09;下載導入模板 js實現 &#xff08;方法1&#xff09;上傳文件實現 效果圖&#xff08;方法2&#xff09;代碼實現&#xf…

多語言大模型 Aya-23 開源!覆蓋23種語言,性能刷新SOTA

文章目錄 1. Aya-23 技術特點1.1 預訓練階段1.2 指令微調階段 2. Aya-23 性能表現3. Aya-23 多語言任務評估4. Aya-23 支持 23 種語言5. Aya-23 應用場景 近年來&#xff0c;多語言大模型&#xff08;MLLM&#xff09;發展迅速&#xff0c;但大多數模型的性能依然存在顯著差距&…

“滴滴打車,用友入賬”,YonSuite商旅費控助力企業“降低成本”更進一步

在當今競爭激烈的商業環境中&#xff0c;企業對于成本控制和效率提升的需求日益迫切。特別是在商旅管理方面&#xff0c;如何有效整合資源、優化流程、降低費用&#xff0c;成為了成長型企業關注的焦點。用友YonSuite商旅費控作為用友集團旗下的重要產品&#xff0c;憑借其卓越…

ctfshow pwn17-18

毛坯的人生和精裝的朋友圈 pwn17 while ( 1 ){menu();v4 0;puts("\nEnter the command you want choose:(1.2.3.4 or 5)\n");__isoc99_scanf("%d", &v4);switch ( v4 ){case 1:system("id");break;case 2:puts("Which directory?(/,…

克隆別人的項目并上傳到自己的倉庫

克隆別人的項目并上傳到自己的倉庫通常涉及以下步驟&#xff1a; 克隆項目&#xff1a;首先&#xff0c;你需要將別人的項目克隆到你的本地計算機。可以使用以下Git命令&#xff1a; git clone [項目的URL]將 [項目的URL] 替換為你想克隆的項目的URL。 創建新的倉庫&#xff1…

卡爾曼濾波算法的matlab實現

卡爾曼濾波算法的matlab實現 figure; hold on;Z(1:1:100); %觀測值&#xff1a;第一秒觀測1m 第二秒觀測兩米 勻速運動, 每秒1m, 最后擬合的也是速度 1m/splot(Z); plot([0,100], [1,1]);noiserandn(1,100)*0.5; %生成方差為1的高斯噪聲 ZZnoise; % 加入噪聲plot(Z);X[0;…

LabVIEW動態力傳感器校準系統

LabVIEW動態力傳感器校準系統 開發了一種基于LabVIEW的動態力傳感器校準系統。系統主要用于動態力的測量和校準&#xff0c;通過高度集成化和自動化的設計&#xff0c;顯著提升校準的效率和精確度。系統采用沖擊法進行動態校準&#xff0c;涵蓋了完整的硬件設計和軟件開發流程…

Kotlin 注解

文章目錄 定義注解類的注解標注目標聲明 定義 注解使用annotation關鍵字定義&#xff0c;且只能用于普通類&#xff0c;該類被稱為注釋類。可以使用注釋類為某個變量、函數、類、接口等注釋。與我們寫的代碼注釋類似&#xff0c;注釋類可以指明被標注類的狀態、作用等等&#…

智能體應用開發:構建各類垂直領域的ai智能體應用

最近在做個類似的項目&#xff0c;有用到這方面的知識&#xff0c;順便做一些記錄和筆記吧&#xff0c;希望能幫到大家了解智能體應用開發 目錄 引言 AI原生應用的興起 智能體在AI中的角色 實現原理詳解 機器學習基礎 數據管理與關聯數據庫 數據結構 Embedding 檢索方…

Pytorch實用教程:torch.cat()函數的用法詳解

torch.cat 是 PyTorch 中用于沿指定維度連接張量的函數。以下是該函數的詳細用法: 語法 torch.cat(tensors, dim=0, *, out=None)參數說明 tensors (sequence of Tensors): 要連接的張量序列。這些張量必須具有相同的形狀(除了連接的維度)。dim (int, optional): 沿著哪個…