Java數組演算法(二分、冒泡、選擇、快排)

来源:https://www.cnblogs.com/tie-dao/archive/2022/09/08/16650604.html
-Advertisement-
Play Games

查找 二分查找 時間複雜度:O (logN) 說明:取數組中間的值和查找值進行比較、如果 中間的值大於要查找的值、則高位索引往中間索引-1、小於則是低位索引往上提、即中間索引+1、一直迴圈直至找到值、最後沒有找到則返回-1 /** * 二分查找法 * @return 返回查找的索引、沒有則返回-1 ...


查找

二分查找

時間複雜度:O (logN)

說明:取數組中間的值和查找值進行比較、如果 中間的值大於要查找的值、則高位索引往中間索引-1、小於則是低位索引往上提、即中間索引+1、一直迴圈直至找到值、最後沒有找到則返回-1

/**
  * 二分查找法
  * @return 返回查找的索引、沒有則返回-1
  */
public static int binarySearch(int[] arrs, int key) {
    // 定義了低位索引和高位索引
    int lowIndex = 0, highIndex = arrs.length - 1;
    // 一直迴圈、直至低位索引和高位索引值一致
    while (lowIndex <= highIndex) {
        // 取中間索引、即低位索引+高位索引的和除以2、正數右移n位相當於除以2的n次方
        int midIndex = (lowIndex + highIndex) >>> 1,
        midValue = arrs[midIndex];
        if (midValue > key)
            highIndex = midIndex - 1;
        else if (midValue < key)
            lowIndex = midIndex + 1;
        else
            return midIndex;
    }
    return -1;
}

排序

冒泡排序

時間複雜度:O (n)

/**
  * 冒泡排序
  */
public static void sort(int[] arr) {
    for (int i = 1; i < arr.length; i++) {
        for (int j = 0; j < arr.length - i; j++) {
            if (arr[j] > arr[j + 1]) {
                // 交換
                arr[j] = arr[j] ^ arr[j + 1];
                arr[j + 1] = arr[j] ^ arr[j + 1];
                arr[j] = arr[j] ^ arr[j + 1];
            }
        }
    }
}

選擇排序

時間複雜度:O(n²)

選擇排序是一種簡單直觀的排序演算法,無論什麼數據進去都是 O(n²) 的時間複雜度。所以用到它的時候,數據規模越小越好。唯一的好處可能就是不占用額外的記憶體空間了吧。

/**
  * 選擇排序
  */
public static void sort(int[] arr) {
    // 總共要經過 N-1 輪比較
    for (int i = 0; i < arr.length - 1; i++) {
        int min = i;

        // 每輪需要比較的次數 N-i
        for (int j = i + 1; j < arr.length; j++) {
            if (arr[j] < arr[min]) {
                // 記錄目前能找到的最小值元素的下標
                min = j;
            }
        }

        // 將找到的最小值和i位置所在的值進行交換
        if (i != min) {
            arr[i] = arr[i] ^ arr[min];
            arr[min] = arr[i] ^ arr[min];
            arr[i] = arr[i] ^ arr[min];
        }
    }
}

快速排序

時間複雜度:O(nlogn) 速度最快

/**
  * 快速排序
  * @param src 數組
  * @param begin 起始索引
  * @param end 尾部索引
  */
public static void sort(int[] src, int begin, int end) {
    if (begin < end) {
        int key = src[begin];
        int i = begin;
        int j = end;
        while (i < j) {
            while (i < j && src[j] > key) {
                j--;
            }
            if (i < j) {
                src[i] = src[j];
                i++;
            }
            while (i < j && src[i] < key) {
                i++;
            }
            if (i < j) {
                src[j] = src[i];
                j--;
            }
        }
        src[i] = key;
        sort(src, begin, i - 1);
        sort(src, i + 1, end);
    }
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 摘要:圖像銳化和邊緣提取技術可以消除圖像中的雜訊,提取圖像信息中用來表徵圖像的一些變數,為圖像識別提供基礎。 本文分享自華為雲社區《[Python圖像處理] 十七.圖像銳化與邊緣檢測之Roberts運算元、Prewitt運算元、Sobel運算元和Laplacian算》,作者: eastmount 。 由於 ...
  • 本專欄的上一篇文章寫了《長篇圖解etcd核心應用場景及編碼實戰》,本文繼續。後續計劃章節內容如下: 《長篇圖解etcd核心應用場景及編碼實戰》 《搭建高可用etcd集群》 《基於etcd實現分散式鎖(java代碼實現)》 《基於etcd實現配置變更通知(java代碼實現)》 《基於etcd實現服務註 ...
  • Spring框架筆記 IOC容器(控制反轉) 什麼是 IOC ​ 控制反轉,把對象創建和對象之間的調用過程,交給Spring進行管理。 使用IOC目的: ​ 降低耦合度 ​ 通過控制反轉,對象在被創建的時候,由一個調控系統內所有對象的外界實體將其所依賴的對象引用傳遞給他。也可以說依賴被註入到對象中。 ...
  • 5. 數據查詢 欲看此文,必看如下兩篇文章: Druid支持JSON-over-HTTP和SQL兩種查詢方式。除了標準的SQL操作外,Druid還支持大量的唯一性操作,利用Druid提供的演算法套件可以快速的進行計數,排名和分位數計算。 5.1 準備工作 5.1.1 導入大量數據 準備大量數據提供查詢 ...
  • 以.uos為尾碼的文件,表示Uniform Office Spreadsheet文件,是一種國產的辦公文件格式,該格式以統一辦公格式(UOF)創建,使用XML和壓縮保存電子錶格。既有的Excel表格文件,可以通過格式轉換的方式轉換為UOS格式,本文將對此作相關介紹。 【導入jar包】 使用jar包: ...
  • 我國目前並未出台專門針對網路爬蟲技術的法律規範,但在司法實踐中,相關判決已屢見不鮮,K 哥特設了“K哥爬蟲普法”專欄,本欄目通過對真實案例的分析,旨在提高廣大爬蟲工程師的法律意識,知曉如何合法合規利用爬蟲技術,警鐘長鳴,做一個守法、護法、有原則的技術人員。 案情介紹 2017年以來,被告人王世傑工作 ...
  • 一、Map的使用 前面我們在Mapper介面的方法中,傳入的參數都是一個基本類型或者是一個實體類,那麼如果我們需要的參數不止一個但又用不到實體類所有的屬性有沒有什麼更好的辦法呢,這裡我們就可以用到Map了。 我們還是以具體的操作來進行理解。 1.利用Map實現查詢 (1)修改UserMapper介面 ...
  • 一、什麼是索引 在mysql中,索引是一種特殊的資料庫結構,由數據表中的一列或多列組合而成,可以用來快速查詢數據表中有某一特定值的記錄。通過索引,查詢數據時不用讀完記錄的所有信息,而只是查詢索引列即可,索引是幫助Mysql高效獲取數據且以排好序的數據結構,直觀的說,索引就類似書的目錄頁,沒有目錄(即 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...