Java常見排序算法之堆排序

在學習算法的過程中,我們難免會接觸很多和排序相關的算法。總而言之,對于任何編程人員來說,基本的排序算法是必須要掌握的。

從今天開始,我們將要進行基本的排序算法的講解。Are you ready?Let‘s go~~~

1、排序算法的基本概念的講解

???? 時間復雜度:需要排序的的關鍵字的比較次數和相應的移動的次數。

???? 空間復雜度:分析需要多少輔助的內存。

???? 穩定性:如果記錄兩個關鍵字的A和B它們的值相等,經過排序后它們的位置沒有發生交換,那么我們稱這個排序算法是穩定的。

????????????? 否則我們稱這個排序算法是不穩定的。

???

??? 排序算法的常見分類:

??? 1、內部排序(最常見的一種排序方式,不需要借助第三方輔助存儲工具)

??? 2、外部排序(需要借助外部存儲來輔助完成相關的排序操作)

??????? 如果參與排序的數據元素非常的多,數據量非常的大,計算機無法把整個排序過程放到內存中進行的話,

??????? 我們必須借助外部存儲器如磁盤來完成,這種排序方式,我們稱之為外部排序。

??????? 其中外部排序最常見的就是多路歸并排序,即將原始文件分解成多個能夠一次性裝入內存的部分,分別把每一部分調入

??????? 內存完成相應的排序,接下來在對多個有序的外部文件進行多路歸并排序。

??

?? 對于我們絕大多數的程序員而言,我們經常遇到的為內部排序。接下來我們將要對常見的內部排序進行相應的講解。

??? 今天要講解的內部排序為:

?? ?堆排序

? 1、堆排序的基本概念的講解

???? 堆排序是一個樹形選擇排序方法,它的特點是:在排序過程中,將L[1...n]看成是一棵完全二叉樹的順序存儲結構,利用完全二叉樹

??? 中雙親結點和孩子結點之間的內在關系,在當前無序區中選擇關鍵字最大(或最小)的元素。

???堆的定義如下:n個關鍵字序列L[1...n]稱為堆,當且僅當該序列滿足:

???①L(i)<=L(2i)且L(i)<=L(2i+1)

???②L(i)>L(2i)且L(i)>=L(2i+1)(1<=i<=[n/2])

???滿足第一種情況的堆稱為小根堆(小頂堆),

???滿足第二種情況的堆稱為大根堆(大頂堆)。

???算法思想:對于構造初始堆,就是一個反復篩選的過程。

???n個結點的完全二叉樹,最后一個結點是第【n/2】個結點為根的孩子。

?? 對第【n/2】個結點為根的子樹篩選,使該子樹成為堆。

?? 之后向前依次對各結點(【n/2】-1~1)為根的子樹進行篩選,看該結點值是否大于其左右結點的值,

???若不是,將左右結點中較大值與之交換,交換后可能會破壞下一級的堆,于是繼續采用上述方法構造

? ?下一級的堆,直到以該結點的子樹構造成堆為止。

?? 反復利用上述調整堆的方法建堆,直到根節點為止。

? 2、堆排序之Java代碼實現

?

package com.yonyou.test;/*** 內部排序算法之堆排序* 默認按照從小到大進行排序操作* @author 小浩* @創建日期 2015-3-24*/
public class Test{public static void main(String[] args) {//需要進行排序的數組int[] array=new int[]{8,3,2,1,7,4,6,5};//輸出原數組的內容printResult(array);//進行堆排序操作for(int i=array.length-1;i>0;i--){//進行n-1次建大頂堆,每次建堆,都把最小的值放到根位置上面//同時在每次建堆的過程中選出最大的值作為根//創建大頂堆的過程也是創建完全二叉樹的過程buildMaxHeap(array,i);}//輸出排序后的相關結果printResult(array);}/*** 建立大頂堆的過程* @param array* @param i*/private static void buildMaxHeap(int[] array, int i) {//從葉子節點的第一個父節點開始循環for(int j=(i-1)/2;j>=0;j--){   //最后一個節點并且這棵樹只有左子樹if((2*j+1==i)&&(i%2!=0)){if(array[j]<array[2*j+1])swap(array,j,2*j+1);}else{if(array[j]<array[2*j+1])swap(array,j,2*j+1);if(array[j]<array[2*j+2])swap(array,j,2*j+2);}}swap(array,0,i);}/*** 輸出相應數組的結果* @param array*/private static void printResult(int[] array) {for(int value:array)		System.out.print(" "+value+" ");System.out.println();}/*** 交換數組中兩個變量的值* @param array* @param i* @param j*/private static void swap(int[] array,int i,int j){int temp=array[i];array[i]=array[j];array[j]=temp;}
}

  3.堆排序的效率分析

??? 時間復雜度:假設有n個數據,數據交換的次數最多為n-1次,但程序的總體的比較次數較多。所以綜合考慮有直接選擇排序的時間復雜度為O(n2)

?? (n的平方)。所以當記錄占用字節數較多時,通常比直接插入排序的執行速度快些。

??? 空間復雜度:直接選擇排序的空間復雜度很好,它只需要一個附加單元用于數據交換,所以其空間復雜度為O(1)。

??? 穩定性:由于在直接選擇排序中存在著不相鄰元素之間的互換,因此,直接選擇排序是一種不穩定的排序方法。

?

?? 好吧,直接選擇排序的講解就先到這里了。

??

?

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

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

相關文章

python量化數據處理小細節2

處理數據主要使用的是DataFrame格式&#xff0c;偶爾也會有list格式。 首先定位尋找數據&#xff1a;主要為loc&#xff0c;iloc 創建DataFrame&#xff1a; df pd.DataFrame([1,2,3,4,5],index [a,b,c,d,e],columns[aa])或 datapd.DataFrame(np.arange(16).reshape(4,4),i…

python編碼問題

參考&#xff1a;https://blog.csdn.net/qq_33692803/article/details/81321340 注意區分系統默認編碼和本地默認編碼、編碼和解碼的區別轉載于:https://www.cnblogs.com/jianglinliu/p/10418437.html

軟件工程師所需掌握的“終極技術”是什么?

最近&#xff0c;我在微博上看到程序員鄒欣老師發的一條微博 — “不少大學同學都有一個想法&#xff1a;先做幾年技術&#xff0c;然后做管理&#xff1b;也有一些同學說&#xff1a;我技術不行&#xff0c;希望直接找到一個管理的工作&#xff0c;就像PM那樣。請看 PM 需要什…

linux中項目部署和日志查看

1 查找進程 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 ps -ef | grep java 查看所有關于java的進程 root 17540 1 0 2009 ? 01:42:27 /usr/java/jdk1.5.0_1…

dspmq dspmqver command not found(dspmq命令找不到,dspmqver主安裝目錄設置不正確

[rootrhv6-64b ~]# su - mqm -bash-4.1$ dspmq -bash: dspmq: command not found&#xff08;dspmq命令找不到&#xff09; -bash-4.1$ dspmqver&#xff08;dspmqver主安裝目錄設置不正確&#xff09; AMQ8594: WebSphere MQ commands are no longer available in /usr/bin. I…

lambda表達式與委托與線程初步談論-基于劉鐵錳視頻觀后操作

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;//線程 using System.Threading;//引用線程方法namespace ConsoleApplication2 {class Program{static void Main(string[] args){//委托詳解//Func返回…

2020-11-21

獲取數據后&#xff0c;需要對數據進行合并&#xff0c;通常是日期&#xff0c;也有對相同公司進行合并 下面就研究數據合并的常用方法&#xff1a; 目錄appendmergeon屬性how屬性&#xff08;inner&#xff0c;outer&#xff0c;left &#xff0c; right&#xff09;indicato…

走技術線,還是技術管理線?

最近因為要給剛畢業的學生做一次演講&#xff0c;所以就職業發展這類話題先以寫博客的形式做一些思考&#xff0c;希望屆時能給同學們帶來質量更高的內容。我在《駕馭你的“職場布朗運動”》一文中談了25條職場感悟并提出了“走技術線&#xff0c;還是技術管理線&#xff1f;”…

[Nikon D80]櫻花盛開的校園

花開花落&#xff0c;陽春三月&#xff0c;隨身背著相機在學校里游走&#xff0c;不斷的尋找視角。知道自己拍的不好&#xff0c;總覺得自己拍的片有各式各樣的缺陷&#xff0c;也許這就是大師與學徒的區別吧。用好手頭的裝備&#xff0c;出好片&#xff0c;鍛煉Visual Effect …

「LG2664 樹上游戲」

題目 這真是一道神仙的一批的題目 定義\(s(i,j)\)表示從點\(i\)到點\(j\)經過的顏色數量 設 \[sum_i\sum_{j1}^ns(i,j)\] 求出所有的\(sum_i\) 考慮點分治 對于一個點我們用兩種方式來統計其答案 這個點作為分治重心時&#xff0c;分值區域內所有點到這個點貢獻這個點不是分治重…

DUBBO 使用問題記錄

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 官方ISSUE參考 https://github.com/alibaba/dubbo/issues 注冊中心ZookeeperRegistry.doSaveProperties warn 2014-10-1419:56:51WARN …

真格量化學習處理——幾個功能小函數

真格這周是學習使用了不少,功能算是很不錯,但在做的時候也發現了一個問題: 數據缺失:我在做回測,要求獲取每天的delta值,并從中篩選條件值時,報錯,顯示無數據。不得不使用pass,影響我的回測連貫性。 現在開始講下,我做的幾個功能函數: 算起來,挺煩的,就是各種細節…

軟件技術發展的驅動力

軟件產品的終極目標是為了實現用戶需求從而滿足人們的需要。也正是為了不斷滿足人們的需要使得軟件行業不斷向前發展。比如&#xff0c;新的算法&#xff08;MPEG-1、MPEG-2、MPEG-4、H.264、……&#xff09;等的出現都在當時為了滿足不同的需要而被發明。然而&#xff0c;人們…

The Model Driven Software Network

國外的一個模型驅動軟件開發的討論社區&#xff0c;The Model Driven Software Network這個社區討論的都是模型驅動開發相關的話題&#xff0c;雖然建立不久&#xff0c;但加入的人越來越多&#xff0c;建立群組的是Mark Dalgarno以下是一些討論: Textual v Graphical models W…

無敵簡單快速的文件服務器sgfs

前言 想要構建一個Linux文件服務器&#xff1f;看看下面幾個要求是不是你想要的&#xff1f; 1、只需要單節點部署就夠了 2、部署啟動簡單&#xff0c;下載之后&#xff0c;一鍵啟動&#xff0c;一鍵關閉 3、不需要任何其他的依賴安裝&#xff0c;而且運行時占用內存資源少 4、…

springboot多數據源配置

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 之前在介紹使用JdbcTemplate和Spring-data-jpa時&#xff0c;都使用了單數據源。在單數據源的情況下&#xff0c;Spring Boot的配置非常…

pyhon量化數據處理小細節3---日期格式轉換

不同的數據文檔&#xff0c;會獲得不同日期格式&#xff0c;常見的有str(20200101),datetime(20200101),又或者是2020-01-01&#xff0c;,2020-1-1,20-1-1&#xff0c;20-Apr_20th,2020/01/01,20/01/01等等&#xff0c;總之類型很多。因此需要我們對日期格式進行統一化。這里我…

面向對象和基于對象

面向對象大家都很熟悉&#xff0c;可是基于對象就不一定了。兩個聽起來好象是同一回事&#xff0c;而事實上它們卻千差萬別。基于對象是指&#xff1a;我們采用對象封裝技術&#xff0c;將數據和操作捆綁在一起&#xff0c;但是并沒有合理地使用多態、繼承等面向對象技術進行軟…

CSS margin 屬性簡介

CSS margin 屬性 設置外邊距的最簡單的方法就是使用 margin 屬性。 margin 屬性接受任何長度單位&#xff0c;可以是像素、英寸、毫米或 em。 margin 可以設置為 auto。更常見的做法是為外邊距設置長度值。下面的聲明在 h1 元素的各個邊上設置了 1/4 英寸寬的空白&#xff1a;h…

MVC中使用代碼創建數據庫(code first +mysql+EF)

1.新建一個mvc項目 2.安裝mysql需要的幾個文件 EntityFramework、MySql.Data&#xff08;6.9.12&#xff09;和MySql.Data.Entity &#xff08;6.9.12&#xff09; 這里有幾點要注意 1.MySql.Data和MySql.Data.Entity 版本必須一致 2.我試用了6.10的版本 要報錯 3.我測試沒有問…