国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

(Java)數(shù)據(jù)結(jié)構(gòu)——排序(第一節(jié))堆排序+PTA L2-012 關(guān)于堆的判斷

這篇具有很好參考價(jià)值的文章主要介紹了(Java)數(shù)據(jù)結(jié)構(gòu)——排序(第一節(jié))堆排序+PTA L2-012 關(guān)于堆的判斷。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

本博客是博主用于復(fù)習(xí)數(shù)據(jù)結(jié)構(gòu)以及算法的博客,如果疏忽出現(xiàn)錯(cuò)誤,還望各位指正。

堆排序(Heap Sort)概念

堆排序是一種基于堆數(shù)據(jù)結(jié)構(gòu)的排序算法,其核心思想是將待排序的序列構(gòu)建成一個(gè)最大堆(或最小堆),然后將堆頂元素與最后一個(gè)元素交換,再將剩余元素重新調(diào)整為最大堆(或最小堆),重復(fù)以上步驟直到所有元素都有序。

堆是一棵完全二叉樹,因此一般可以當(dāng)作數(shù)組處理。

對(duì)于最大堆,任何一個(gè)父節(jié)點(diǎn)的值都大于(或等于)其左右子節(jié)點(diǎn)的值;

對(duì)于最小堆,則是任何一個(gè)父節(jié)點(diǎn)的值都小于(或等于)其左右子節(jié)點(diǎn)的值。

建堆

上濾(插入新元素到堆中)

時(shí)間復(fù)雜度為O(N logN)

也就是一個(gè)一個(gè)插入,比如拿[46 23 26 24 10]來說,建堆過程就如下:

(Java)數(shù)據(jù)結(jié)構(gòu)——排序(第一節(jié))堆排序+PTA L2-012 關(guān)于堆的判斷,排序,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,java,排序算法


        List<Integer> list = new ArrayList<>();
        String[] num = in.nextLine().split(" ");
        
        for(int i = 0;i<N;i++){
            //小頂堆的形成,自上而下建堆,一個(gè)一個(gè)插入
            if(list.size()==0){
                list.add(Integer.parseInt(num[i]));
            }else{
                //如果長(zhǎng)度不是0,就插入后進(jìn)行比較
                list.add(Integer.parseInt(num[i]));
                int count = i;
                while(count!=0){
                    int parent = 0;
                    if((count-1)%2==0){
                        parent = (count-1)/2;
                    }else if((count-2)%2==0){
                        parent =(count-2)/2;
                    }
                    if(list.get(count)<list.get(parent)){
                        int temp = list.get(count);
                        list.set(count,list.get(parent));
                        list.set(parent,temp);
                        count = parent;
                    }else{
                        break;
                    }
                }
            }
        }

下濾

一般用的是下濾,因?yàn)闀r(shí)間復(fù)雜度為O(N)

就是先整體插入,然后從倒數(shù)第一個(gè)非葉子結(jié)點(diǎn)進(jìn)行堆調(diào)整:

1、找到倒數(shù)第一個(gè)非葉子結(jié)點(diǎn)23,判斷其與子節(jié)點(diǎn)關(guān)系,發(fā)現(xiàn)比10大,于是互換

2、之后繼續(xù)尋找非葉子結(jié)點(diǎn),找到46,46與10交換后,繼續(xù)與23交換

(Java)數(shù)據(jù)結(jié)構(gòu)——排序(第一節(jié))堆排序+PTA L2-012 關(guān)于堆的判斷,排序,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,java,排序算法

注意事項(xiàng)

建堆結(jié)束,兩種方法建立的堆可能不一樣,所以注意題目要求透露出的是哪一種。

比如要求上濾的:L2-012 關(guān)于堆的判斷 - 團(tuán)體程序設(shè)計(jì)天梯賽-練習(xí)集 (pintia.cn)

實(shí)現(xiàn)代碼:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String[] mn = in.nextLine().split(" ");
        int N = Integer.parseInt(mn[0]);
        int M = Integer.parseInt(mn[1]);
        List<Integer> list = new ArrayList<>();
        String[] num = in.nextLine().split(" ");

        for(int i = 0;i<N;i++){
            //小頂堆的形成
            if(list.size()==0){
                list.add(Integer.parseInt(num[i]));
            }else{
                //如果長(zhǎng)度不是0,就進(jìn)行比較
                list.add(Integer.parseInt(num[i]));
                int count = i;
                while(count!=0){
                    int parent = 0;
                    if((count-1)%2==0){
                        parent = (count-1)/2;
                    }else if((count-2)%2==0){
                        parent =(count-2)/2;
                    }
                    if(list.get(count)<list.get(parent)){
                        int temp = list.get(count);
                        list.set(count,list.get(parent));
                        list.set(parent,temp);
                        count = parent;
                    }else{
                        break;
                    }
                }
            }
        }

        //System.out.println(list.toString());
        //判斷
        while(M-->0){
            String[] judge = in.nextLine().split(" ");
            //變成在數(shù)組中的下標(biāo)
            int x = list.indexOf(Integer.parseInt(judge[0]));
            if(judge[3].equals("root")){
                if(x==0){
                    System.out.println("T");
                }else{
                    System.out.println("F");
                }
            }else if(judge[3].equals("are")){
                int y = list.indexOf(Integer.parseInt(judge[2]));
                if((y-1)%2==0){
                    if(y+1==x){
                        System.out.println("T");
                    }else{
                        System.out.println("F");
                    }
                }else if((y-2)%2==0){
                    if(y-1==x){
                        System.out.println("T");
                    }else{
                        System.out.println("F");
                    }
                }
            }else if(judge[3].equals("parent")){
                int y = list.indexOf(Integer.parseInt(judge[5]));
                if((y-1)%2==0){
                    if((y-1)/2==x){
                        System.out.println("T");
                    }else{
                        System.out.println("F");
                    }
                }else if((y-2)%2==0){
                    if((y-2)/2==x){
                        System.out.println("T");
                    }else{
                        System.out.println("F");
                    }
                }
            }else if(judge[3].equals("child")){
                int y = list.indexOf(Integer.parseInt(judge[5]));
                if((2*y+1) == x || (2*y+2)== x){
                    System.out.println("T");
                }else{
                    System.out.println("F");
                }
            }
        }
    }
}

(Java)數(shù)據(jù)結(jié)構(gòu)——排序(第一節(jié))堆排序+PTA L2-012 關(guān)于堆的判斷,排序,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,java,排序算法

當(dāng)然,更簡(jiǎn)單的,可以直接使用Java提供的類,直接使用優(yōu)先隊(duì)列toArray解決:

【PTA-訓(xùn)練day1】L2-012 關(guān)于堆的判斷 + L1-002打印沙漏_pta打印沙漏測(cè)試點(diǎn)-CSDN博客

Java優(yōu)先隊(duì)列

關(guān)于Java優(yōu)先隊(duì)列的一篇博主的博客詳細(xì)介紹

【Java】PriorityQueue--優(yōu)先級(jí)隊(duì)列_java priorityqueue-CSDN博客

隊(duì)列是一種先進(jìn)先出(FIFO)的數(shù)據(jù)結(jié)構(gòu) ,但有些情況下, 操作的數(shù)據(jù)可能帶有優(yōu)先級(jí),一般出隊(duì)列時(shí),可能需要優(yōu)先級(jí)高的元素先出隊(duì)列 ,該中場(chǎng)景下,使用隊(duì)列顯然不合適,比如:在手機(jī)上玩游戲的時(shí)候,如果有來電,那么系統(tǒng)應(yīng)該優(yōu)先處理打進(jìn)來的電話.
在這種情況下, 數(shù)據(jù)結(jié)構(gòu)應(yīng)該提供兩個(gè)最基本的操作,一個(gè)是返回最高優(yōu)先級(jí)對(duì)象,一個(gè)是添加新的對(duì)象。 這種數(shù)據(jù)結(jié)構(gòu)就是 優(yōu)先級(jí)隊(duì)列(Priority Queue)。

JDK1.8?中的?PriorityQueue底層使用了堆這種數(shù)據(jù)結(jié)構(gòu)?,而堆實(shí)際就是在完全二叉樹的基礎(chǔ)上進(jìn)行了一些調(diào)整。

默認(rèn)情況下是小根堆,如果需要大根堆,則需要構(gòu)建比較器。

其他方法與隊(duì)列無異。

PriorityQueue<Integer> q=new PriorityQueue<>(); //默認(rèn)小頂堆
 
PriorityQueue<Integer> q=new PriorityQueue<>((a,b)->(b-a)); //大頂堆
 
q.contains(val);
 
Integer[] t=q.toArray(new Integer[n]); //將隊(duì)列轉(zhuǎn)化為數(shù)組

堆排序

上述三種建堆的方法,每次之后將最頂點(diǎn)進(jìn)行一下處理(移除或者加入數(shù)組末尾等操作),然后重新建堆再操作即可實(shí)現(xiàn)堆排序。

應(yīng)用場(chǎng)景

堆排序使用場(chǎng)景堆排序的使用場(chǎng)景與其他排序算法類似,適用于需要對(duì)大量數(shù)據(jù)進(jìn)行排序的場(chǎng)景。比如取出第k大(?。┑臄?shù),這時(shí)候可以用堆排序。

優(yōu)/缺點(diǎn)

優(yōu)點(diǎn)主要包括:

時(shí)間復(fù)雜度較低:堆排序的時(shí)間復(fù)雜度為 O(NlogN),相對(duì)于其他排序算法,其排序速度較快。

不占用額外空間:堆排序是一種原地排序算法,不需要額外的空間來存儲(chǔ)排序結(jié)果。

適用于大數(shù)據(jù)量的排序:堆排序的時(shí)間復(fù)雜度不隨數(shù)據(jù)量的增加而變化,因此適用于大數(shù)據(jù)量的排序。

缺點(diǎn)主要包括:

不穩(wěn)定性:由于堆排序是通過交換元素來實(shí)現(xiàn)排序的,因此在排序過程中可能會(huì)破壞原有的相對(duì)順序,導(dǎo)致排序結(jié)果不穩(wěn)定。

實(shí)現(xiàn)復(fù)雜:相對(duì)于其他排序算法,堆排序的實(shí)現(xiàn)稍微復(fù)雜一些(不過借助Java提供的優(yōu)先隊(duì)列可以簡(jiǎn)單實(shí)現(xiàn)),需要理解堆數(shù)據(jù)結(jié)構(gòu)的基本原理和實(shí)現(xiàn)過程。文章來源地址http://www.zghlxwxcb.cn/news/detail-848771.html

代碼(后續(xù)寫了再上傳,咕咕咕)

到了這里,關(guān)于(Java)數(shù)據(jù)結(jié)構(gòu)——排序(第一節(jié))堆排序+PTA L2-012 關(guān)于堆的判斷的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)之排序

    Java基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)之排序

    假定在待排序的記錄序列中,存在多個(gè)具有相同的的記錄,若經(jīng)過排序,這些記錄的相對(duì)次序保持 不變,即在原序列中, r[i]=r[j] ,且 r[i] 在 r[j] 之前,而在排序后的序列中, r[i] 仍在 r[j] 之前,則稱這種排序算法是穩(wěn) 定的;否則稱為不穩(wěn)定的。 內(nèi)部排序 :數(shù)據(jù)元素

    2024年01月25日
    瀏覽(24)
  • 算法 數(shù)據(jù)結(jié)構(gòu) 遞歸插入排序 java插入排序 遞歸求解插入排序算法 如何用遞歸寫插入排序 插入排序動(dòng)圖 插入排序優(yōu)化 數(shù)據(jù)結(jié)構(gòu)(十)

    算法 數(shù)據(jù)結(jié)構(gòu) 遞歸插入排序 java插入排序 遞歸求解插入排序算法 如何用遞歸寫插入排序 插入排序動(dòng)圖 插入排序優(yōu)化 數(shù)據(jù)結(jié)構(gòu)(十)

    1. 插入排序(insertion-sort): ????????????????????????????????????????? 是一種簡(jiǎn)單直觀的排序算法。它的工作原理是通過構(gòu)建有序序列,對(duì)于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入 ??? 算法穩(wěn)定性: ?????????????????

    2024年02月09日
    瀏覽(24)
  • Java 與數(shù)據(jù)結(jié)構(gòu)(6):快速排序

    Java 與數(shù)據(jù)結(jié)構(gòu)(6):快速排序

    ChatGPT 中文指南(大全) 內(nèi)容包含:如何開通chatgpt、chatgpt的同類站點(diǎn)、prompts 、AI繪圖、ChatGPT 工具、相關(guān)報(bào)告論文、ChatGPT應(yīng)用項(xiàng)目等 鏈接:ChatGPT 中文指南(大全) 指令指南,精選資源清單,更好的使用 chatGPT 讓你的生產(chǎn)力up up up! 快速排序(Quick Sort)是一種基于分治思想的排序

    2024年02月07日
    瀏覽(25)
  • 【數(shù)據(jù)結(jié)構(gòu)】用Java實(shí)現(xiàn)七大排序算法

    【數(shù)據(jù)結(jié)構(gòu)】用Java實(shí)現(xiàn)七大排序算法

    目錄 ??1. 排序的概念及引用 1.1 排序的概念 1.2 衡量指標(biāo) 1.2 十個(gè)排序算法 ?1.3 十個(gè)排序性能對(duì)比 ??2. 冒泡排序 2.1 算法描述 2.2 動(dòng)圖 ??代碼優(yōu)化 ??3. 選擇排序 3.1 算法描述 3.2 動(dòng)圖 ?3.3 代碼 ??4. 插入排序 4.1 算法描述 4.2 動(dòng)圖 ?4.3 代碼 ??5 希爾排序 5.1 描述 5.2 動(dòng)圖 ?

    2023年04月23日
    瀏覽(31)
  • 【算法與數(shù)據(jù)結(jié)構(gòu)】Java實(shí)現(xiàn)查找與排序

    【算法與數(shù)據(jù)結(jié)構(gòu)】Java實(shí)現(xiàn)查找與排序

    也叫做折半查找,屬于有序查找算法。 前提條件 :數(shù)組數(shù)據(jù)必須有序,從小到大,或者從大到小都是可以的。 如果是無序的,也可以先進(jìn)行排序。 但是排序之后,會(huì)改變?cè)袛?shù)據(jù)的順序,查找出來元素位置跟原來的元素可能是不一樣的,所以排序之后再查找只能判斷當(dāng)前數(shù)

    2024年01月19日
    瀏覽(31)
  • 數(shù)據(jù)結(jié)構(gòu)中的七大排序(Java實(shí)現(xiàn))

    數(shù)據(jù)結(jié)構(gòu)中的七大排序(Java實(shí)現(xiàn))

    目錄 一、直接插入排序 二、希爾排序 三、直接選擇排序 四、堆排序 五、冒泡排序 六、快速排序 七、歸并排序 ? ? ? ? ? ? ? 定義i下標(biāo)之前的元素全部已經(jīng)有序 ,遍歷一遍要排序的數(shù)組,把i下標(biāo)前的元素全部進(jìn)行排序,當(dāng)遍歷玩這個(gè)數(shù)組后,就已經(jīng)排好序了。 ? ? ? ?

    2024年02月08日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu)(超詳細(xì)講解!?。┑诙还?jié) 特殊矩陣的壓縮存儲(chǔ)

    數(shù)據(jù)結(jié)構(gòu)(超詳細(xì)講解?。。┑诙还?jié) 特殊矩陣的壓縮存儲(chǔ)

    值相同的元素只存儲(chǔ)一次 壓縮掉對(duì)零元的存儲(chǔ),只存儲(chǔ)非零元 特殊形狀矩陣: 是指非零元(如值相同的元素)或零元素分布具有一定規(guī)律性的矩陣。 如: 對(duì)稱矩陣 上三角矩陣???下三角矩陣 對(duì)角矩陣? ?準(zhǔn)對(duì)角矩陣 三角矩陣大體分為三類:下三角矩陣、上三角矩陣和對(duì)稱

    2024年02月04日
    瀏覽(25)
  • 《數(shù)據(jù)結(jié)構(gòu)》_PTA_數(shù)據(jù)結(jié)構(gòu)作業(yè)6:圖

    《數(shù)據(jù)結(jié)構(gòu)》_PTA_數(shù)據(jù)結(jié)構(gòu)作業(yè)6:圖

    1-1 無向連通圖所有頂點(diǎn)的度之和為偶數(shù)。 T 1-2 無向連通圖邊數(shù)一定大于頂點(diǎn)個(gè)數(shù)減1 F 1-3 無向連通圖至少有一個(gè)頂點(diǎn)的度為1。 F 1-4 用鄰接表法存儲(chǔ)圖,占用的存儲(chǔ)空間數(shù)只與圖中結(jié)點(diǎn)個(gè)數(shù)有關(guān),而與邊數(shù)無關(guān). F 1-5 用鄰接矩陣法存儲(chǔ)圖,占用的存儲(chǔ)空間數(shù)只與圖中結(jié)點(diǎn)個(gè)數(shù)

    2024年02月04日
    瀏覽(60)
  • Java數(shù)據(jù)結(jié)構(gòu)之排序(頭歌平臺(tái),詳細(xì)注釋)

    Java數(shù)據(jù)結(jié)構(gòu)之排序(頭歌平臺(tái),詳細(xì)注釋)

    目錄 第1關(guān):選擇排序 任務(wù)描述 相關(guān)知識(shí) 代碼:?? ?第2關(guān):插入排序 任務(wù)描述 相關(guān)知識(shí) 插入排序 代碼:?? 第3關(guān):歸并排序 任務(wù)描述 相關(guān)知識(shí) 歸并排序 原理 代碼:?? ?第4關(guān):快速排序 任務(wù)描述 相關(guān)知識(shí) 快速排序 代碼:?? ?第5關(guān):堆排序 任務(wù)描述 相關(guān)知識(shí) 堆

    2024年01月19日
    瀏覽(25)
  • 數(shù)據(jù)結(jié)構(gòu)與算法中的七大排序(Java實(shí)現(xiàn))

    數(shù)據(jù)結(jié)構(gòu)與算法中的七大排序(Java實(shí)現(xiàn))

    目錄 一、直接插入排序 二、希爾排序 三、直接選擇排序 四、堆排序 五、冒泡排序 六、快速排序 七、歸并排序 ? ? ? ? ? ? ? 定義i下標(biāo)之前的元素全部已經(jīng)有序 ,遍歷一遍要排序的數(shù)組,把i下標(biāo)前的元素全部進(jìn)行排序,當(dāng)遍歷玩這個(gè)數(shù)組后,就已經(jīng)排好序了。 ? ? ? ?

    2024年02月06日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包