排序-歸并排序(merge sort)

歸并排序(Merge Sort)是一種分而治之的算法,它將原始數組分成越來越小的子數組,直到每個子數組只有一個元素,然后將這些子數組兩兩合并,過程中保持排序狀態,最終合并成一個完全有序的數組。歸并排序是一種穩定的排序算法,其主要特點是效率高且易于理解。

歸并排序的基本步驟:

  1. 分解:將當前區間一分為二,即求中點。
  2. 遞歸排序:遞歸地對兩個子區間a[low...mid]和a[mid+1...high]進行歸并排序。
  3. 合并:將已排序的兩個子區間合并成一個有序區間。

時間復雜度和空間復雜度:

  • 時間復雜度:歸并排序的時間復雜度為O(n log n),無論是最好、最壞還是平均情況都是如此,因為它總是將數組分成兩半進行處理,然后合并,這個過程與數組的初始狀態無關。

  • 空間復雜度:由于歸并排序需要一個與原數組相同大小的臨時數組來合并子數組,所以其空間復雜度為O(n)。

穩定性**:

歸并排序是穩定的排序算法,因為在合并兩個子數組時,如果遇到相等的元素,會先將左側子數組的元素加入結果數組,保持原有順序不變。

以下是歸并排序的實現示例圖:

以下是實現歸并排序的Java代碼:

public class MergeSort {// 合并兩個子數組private static void merge(int[] arr, int left, int mid, int right, int[] temp) {int i = left, j = mid + 1, k = 0;while (i <= mid && j <= right) {if (arr[i] <= arr[j]) {temp[k++] = arr[i++];} else {temp[k++] = arr[j++];}}while (i <= mid) {temp[k++] = arr[i++];}while (j <= right) {temp[k++] = arr[j++];}// 將排序后的元素復制回原數組System.arraycopy(temp, 0, arr, left, right - left + 1);}// 主函數,遞歸進行歸并排序public static void mergeSort(int[] arr, int left, int right, int[] temp) {if (left < right) {int mid = (left + right) / 2;mergeSort(arr, left, mid, temp); // 排序左半部分mergeSort(arr, mid + 1, right, temp); // 排序右半部分merge(arr, left, mid, right, temp); // 合并兩個有序部分}}public static void main(String[] args) {int[] arr = {12, 11, 13, 5, 6, 7};int[] temp = new int[arr.length];mergeSort(arr, 0, arr.length - 1, temp);System.out.println("Sorted array: ");for (int num : arr) {System.out.print(num + " ");}}
}

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

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

相關文章

《一》Word文字編輯軟件---架構設計分析

1&#xff0c;簡單介紹 今天&#xff0c;我們來模擬offic軟件中的word文檔&#xff0c;運行如圖&#xff1a; 運行程序后會出現主界面&#xff0c;頂端的菜單欄包括“文件”“編輯”“格式”“窗口”和“幫助五個主菜單。 菜單欄下面是工具欄&#xff0c;包含了系統常用的功能按…

如何判斷海外住宅ip的好壞?

在海外IP代理中&#xff0c;住宅IP屬于相對較好的資源&#xff0c;無論是用于工作、學習、還是娛樂&#xff0c;都能得到較好的使用效果。作為用戶&#xff0c;該如何判斷海外住宅IP的好壞呢&#xff1f; 穩定性與可靠性&#xff1a;海外住宅IP相比動態IP地址&#xff0c;通常具…

Java全局異常處理,@ControllerAdvice異常攔截原理解析【簡單易懂】

https://www.bilibili.com/video/BV1sS411c7Mo 文章目錄 一、全局異常處理器的類型1-1、實現方式一1-2、實現方式二 二、全局異常攔截點2-1、入口2-2、全局異常攔截器是如何注入到 DispatcherServlet 的 三、ControllerAdvice 如何解析、執行3-1、解析3-2、執行 四、其它4-1、設…

電腦提示找不到ffmpeg.dll無法繼續執行代碼怎么辦?

電腦提示找不到找不到ffmpeg.dll無法繼續執行代碼怎么辦&#xff0c;有什么好的解決辦法&#xff0c;出現這樣的彈出就會導致軟件無法打開或者是異常關閉&#xff0c;找不到dll文件&#xff0c;是一個非常重要的電腦使用問題&#xff0c;會給使用者帶來許多的麻煩。那么找不到d…

LeetCode746:使用最小花費爬樓梯

題目描述 給你一個整數數組 cost &#xff0c;其中 cost[i] 是從樓梯第 i 個臺階向上爬需要支付的費用。一旦你支付此費用&#xff0c;即可選擇向上爬一個或者兩個臺階。 你可以選擇從下標為 0 或下標為 1 的臺階開始爬樓梯。 請你計算并返回達到樓梯頂部的最低花費。 代碼 …

MongoDB和AI 賦能行業應用:制造業和汽車行業

歡迎閱讀“MongoDB和AI 賦能行業應用”系列的第一篇。 本系列重點介紹AI應用于不同行業的關鍵用例&#xff0c;涵蓋制造業和汽車行業、金融服務、零售、電信和媒體、保險以及醫療保健行業。 隨著人工智能&#xff08;AI&#xff09;在制造業和汽車行業的集成&#xff0c;傳統…

CDN的工作原理及流程

CDN&#xff08;Content Delivery Network&#xff0c;內容分發網絡&#xff09;是一種構建在數據網絡上的分布式內容分發網絡。 CDN利用全局負載均衡技術&#xff0c;將用戶的訪問請求指向離用戶最近且工作正常的流媒體服務器上&#xff0c;由流媒體服務器直接響應用戶的請求…

Tableau學習2.0版——復習

官網下載鏈接&#xff1a;https://www.tableau.com/zh-cn/support/releases 學生賬戶申請鏈接&#xff1a;https://www.tableau.com/zh-cn/academic/students。直接去學信網下載學籍在線驗證作為申請證明。 目錄 1、可視化原理 2、基礎圖表制作 2.1 對比分析&#xff08;比…

@游戲行業er!MongoDB廣州線下沙龍邀您報名!

隨著游戲和應用程序的發展&#xff0c;數據變得越來越重要。在為您的下一個游戲選擇數據庫時&#xff0c;數據庫管理者常常會面對靈活性、可擴展性、可靠性、運營效率等問題或挑戰。 MongoDB在游戲開發領域有著廣泛的應用&#xff0c;靈活數據模型可以存儲和處理各種類型的數據…

JPA ENTITY EXTEND

1. Overview Relational databases don’t have a straightforward way to map class hierarchies onto database tables. To address this, the JPA specification provides several strategies: MappedSuperclass – the parent classes, can’t be entitiesSingle Table …

webpack處理js和css模塊化導入導出示例:

webpack默認并不能處理js模塊化的導入和導出,依賴于ts-loader和babel-loader webpack.config,js module.exports {entry: ./src/index.ts,output: {filename: main.js,},mode: development, // 或者 productionmodule: {rules: [{test: /\.ts/,exclude: /(node_modules)/,use:…

二維平移矩陣 (2D translate matrix)

2D translate matrix 推薦閱讀正文推薦閱讀 矢量旋轉矩陣 正文 之前我們介紹了矢量旋轉矩陣的形式,這里我們來介紹一下平移矩陣的形式。比如,我們我們有一個點,其坐標為 (0,1)。那么我們如何操作才能夠將這個點沿著 x 軸正方向平移 1 個單位長度呢? 這里我們以向右移動…

vj題單 P4552 [Poetize6] IncDec Sequence

思路&#xff1a; 一次操作&#xff1a;選一個區間[l, r]&#xff0c;把這個區間的數都加1或者都減1&#xff0c;可以將求該數列的差分數組b然后來進行該操作 一次操作的兩種種情況&#xff1a;&#xff08;l可以等于r&#xff09; 1.b[l]1 b[r1]-1 2.b[l]-1 b[r1]1 Q1:…

PHP 提取數組中的特定的值

需求&#xff1a; 前端展示&#xff1a; &#xff08;1&#xff09;之前的頁面&#xff1a; &#xff08;2&#xff09;修改后的頁面&#xff1a; 之前接口返回的數據 &#xff1a; 解決辦法&#xff1a;提取tags 中的 ’約 的數組 添加到一個新的數組中去 1&#xff1a;一開…

【CPP】多線程并發—— Mutex 和 Lock

#include <iostream> #include <thread> #include <mutex> #include "my_utils.h"std::mutex mtx; // 全局互斥鎖 int shared_data 0; // 共享數據 void increment() { for (int i 0; i < 10; i) { std::cout <<"incre…

2024年去除視頻水印的5種方法

如果你從事電影剪輯或者視頻編輯工作&#xff0c;你經常需要從優酷、抖音、TikTok下載各種視頻片段……。 通常這些視頻帶有水印和字幕。一些免費軟件如CapCut、canva、Filmora也會給你制作的視頻打上水印&#xff0c;這些水印嵌入在視頻內部。 2024年去除視頻水印的5種方法 …

Mysql-用戶變量的聲明與使用

#聲明變量 #1.標識符不能以數字開頭 #2.只能使用_或$符號&#xff0c;不能使用其他符號 #3.不能使用系統關鍵字 setuserName劉德華; select userName:劉青云;#將賦值與查詢結合 #查詢變量、使用變量&#xff0c;匿名的時候建議加上as select userName as 讀取到的userName變量…

Golang面向對象編程(二)

文章目錄 封裝基本介紹封裝的實現工廠函數 繼承基本介紹繼承的實現字段和方法訪問細節多繼承 封裝 基本介紹 基本介紹 封裝&#xff08;Encapsulation&#xff09;是面向對象編程&#xff08;OOP&#xff09;中的一種重要概念&#xff0c;封裝通過將數據和相關的方法組合在一起…

java JOptionPane 介紹

JOptionPane是Java Swing庫中的一個類,用于創建對話框(Dialogs),以便與用戶進行交互。它提供了一種簡單的方式來顯示消息、警告、錯誤、輸入框等。 主要方法: showMessageDialog(Component parentComponent, Object message):顯示一個包含消息的對話框。showInputDialog…

2024OD機試卷-手機App防沉迷系統 (java\python\c++)

題目:手機App防沉迷系統 題目描述 智能手機方便了我們生活的同時,也侵占了我們不少的時間。 “手機App防沉迷系統”能夠讓我們每天合理地規劃手機App使用時間,在正確的時間做正確的事。 它的大概原理是這樣的: 在一天24小時內,可以注冊每個App的允許使用時段一個時間段只…