」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 嘗試這個快速排序

嘗試這個快速排序

發佈於2024-11-01
瀏覽:644

Tente Isto  A classificação rápida

在第五章中,你看到了一個簡單的排序方法,稱為
冒泡排序。當時提到有
收視率顯著提高。在這裡,您將開發最好的版本之一:快速排序(Quicksort)。
快速分類,由C.A.R.發明並命名Hoare,是目前最好的通用分類演算法。我無法在第五章中展示它,因為快速排序的最佳實作是基於遞歸的。我們將開發的版本對字元數組進行排序,但邏輯可以適應對任何類型的物件進行排序。
快速排序是基於分區的想法。一般過程包括選擇一個值(稱為比較),然後將陣列分成兩個部分。所有大於或等於分區值的元素都插入到一側,較小的元素插入到另一側。對每個剩餘部分重複此過程,直到數組排序完畢。例如,給定數組 fedacb 並使用值 d 作為比較,快速排序的第一遍將重新排列數組,如下所示:

初始 f e d a c b
第 1 段 b c a d e f

然後對每個部分(即 bca 和 def)重複此過程。正如您所看到的,該過程本質上是遞歸的,事實上,快速排序的最乾淨的實作是遞歸的。
您可以透過兩種方式選擇比較值。您可以隨機選擇它,也可以透過尋找從陣列中獲得的一小組值的平均值來選擇它。為了獲得最佳分類,您必須選擇正好位於值範圍中間的值。然而,對於大多數數據集來說,做到這一點並不容易。最糟的情況是所選值位於一端。即便如此,快速排序仍能正確運作。
我們將開發的快速排序版本選擇數組的中間元素作為比較。

參見QSDemo.java。

快速排序:

  • 最有效率、使用最廣泛的分類演算法之一。
  • 由 C.A.R. 發明霍爾。
  • 是基於分區的概念,其中數組被分成遞歸排序的部分。
  • 比冒泡排序等簡單方法更有效率。

手術:

  • 比較值(樞軸):
  • 選擇一個值作為參考(樞軸),並圍繞該值組織陣列。
  • 小於主元的元素移至一側,較大的元素移至另一側。
  • 對每個部分遞歸地重複此過程,直到陣列完全排序。

快速排序

QS演示

版本聲明 本文轉載於:https://dev.to/devsjavagirls/tente-isto-6-3-a-classificacao-rapida-3e8h?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • `WaitGroup.Wait()` 是否提供記憶體屏障並確保 Go 中的資料可見性?
    `WaitGroup.Wait()` 是否提供記憶體屏障並確保 Go 中的資料可見性?
    WaitGroup.Wait() 和內存屏障:澄清保證在Go 中,WaitGroup 類型是一個同步原語,用於跟踪完成一組goroutine。問題來了:當呼叫 wg.Wait() 來等待所有 goroutine 完成時,這是否意味著記憶體屏障?我們將深入研究這個問題並探索官方文件和相關討論。 Wai...
    程式設計 發佈於2024-11-08
  • ## 如何在 PHP 中即時執行匿名函數?
    ## 如何在 PHP 中即時執行匿名函數?
    在PHP 中立即執行匿名函數在JavaScript 中,使用語法立即定義和執行匿名函數非常簡單:(function () { /* do something */ })()PHP 中是否有類似的機制? PHP 7 在PHP 7 及更高版本中,可以即時、方便地執行匿名函數:(function() {...
    程式設計 發佈於2024-11-08
  • 如何在Go中高效率讀寫CSV檔?
    如何在Go中高效率讀寫CSV檔?
    Go 中高效讀寫 CSV 檔案資料處理中的一個常見任務是以高效能方式讀寫 CSV 檔案。問題中提供的程式碼片段演示了一種讀取 CSV 檔案、處理資料並將其寫回的緩慢方法。潛在的低效率在於在處理之前將整個文件載入到記憶體中的方法。 為了優化程式碼,建議透過呼叫 .Read() 增量讀取檔案並一次處理一...
    程式設計 發佈於2024-11-08
  • 如何處理 Java 中的「無法將給定物件格式化為日期」錯誤?
    如何處理 Java 中的「無法將給定物件格式化為日期」錯誤?
    處理Java 中的「無法將給定物件格式化為日期」錯誤當嘗試將給定日期轉換為特定格式時,Java 開發人員可能會遇到異常: “java.lang.IllegalArgumentException:無法將給定物件格式化為日期。”當嘗試將不受支援的物件格式化為日期時,會出現此錯誤。 要解決此問題,我們需要...
    程式設計 發佈於2024-11-08
  • RPC 操作 EPU 使用 Protobuf 並建立自訂插件
    RPC 操作 EPU 使用 Protobuf 並建立自訂插件
    上一篇文章中,我使用net/rpc包实现了一个简单的RPC接口,并尝试了net/rpc自带的Gob编码和JSON编码,学习了Golang的一些基础知识远程过程调用。在这篇文章中,我将结合 net/rpc 和 protobuf 并创建我的 protobuf 插件来帮助我们生成代码,所以让我们开始吧。 ...
    程式設計 發佈於2024-11-08
  • 無需媒體查詢的響應式佈局
    無需媒體查詢的響應式佈局
    How often do you use media queries when building web layouts? I’ve spent too much time on them! First you spent quite a lot of time trying to make the...
    程式設計 發佈於2024-11-08
  • 使用 JavaScript 更改錨標記 href 屬性時如何防止頁面重新載入?
    使用 JavaScript 更改錨標記 href 屬性時如何防止頁面重新載入?
    點擊按鈕時使用JavaScript更改錨標籤的href屬性在web開發中,需要動態修改錨標籤的href屬性按鈕點擊時常出現錨標籤。以下是使用 JavaScript 實現此目的的方法。 在提供的程式碼片段中,f1() 函數將 ID 為「abc」的元素的 href 屬性變更為「xyz.php」。但是,提...
    程式設計 發佈於2024-11-08
  • 使用 Sheepy 在 Python 中進行單元測試
    使用 Sheepy 在 Python 中進行單元測試
    大家好,今天我来给大家介绍一个新的单元测试库,叫做sheepy,不过首先我们来说说单元测试的重要性。这个库不适合初学者,要使用它进行单元测试,您需要额外注意。它仅具有用于使用端点和 http 错误检查模块进行 API 测试的断言。 Github链接:github PyPi 链接:pypi 生产中所有...
    程式設計 發佈於2024-11-08
  • 為什麼「pch.h」應該成為 C/C++ 專案中的第一個頭檔?
    為什麼「pch.h」應該成為 C/C++ 專案中的第一個頭檔?
    預編譯頭:理解「pch.h」在C和C語言開發中,「pch.h」代表預編譯頭文件。將其作為第一個頭檔包含在編譯速度方面具有顯著的優勢。 什麼是預編譯頭? 預編譯頭是頭的中間形式編譯器產生的檔案。它包含優化編譯過程的編譯訊息,特別是對於大型或大量包含的頭檔。 為什麼包含「pch.h」作為第一個頭檔? 在...
    程式設計 發佈於2024-11-08
  • 探索 JVM 虛擬執行緒機制中的固定
    探索 JVM 虛擬執行緒機制中的固定
    Java 的虚拟线程提供了传统操作系统线程的轻量级替代方案,从而实现了高效的并发管理。但了解他们的行为对于获得最佳表现至关重要。这篇博文深入探讨了固定(一种可能影响虚拟线程执行的场景),并探讨了监控和解决该问题的技术。 虚拟线程:一种轻量级并发方法 Java 的虚拟线程是运行在底层操...
    程式設計 發佈於2024-11-08
  • 如何在不使用分析函數的情況下有效率地選擇 MySQL 中每個類別的前幾行?
    如何在不使用分析函數的情況下有效率地選擇 MySQL 中每個類別的前幾行?
    在MySQL 中選擇每個類別的前幾行要從表中的每個類別中檢索有限數量的行,您可以使用分析函數。然而,MySQL 並不會直接提供這些功能。不過,可以使用變數來模擬它們。 模擬分析函數以下MySQL 查詢模擬分析函數的功能,以選擇每個類別的前3 行:SELECT x.* FROM ( SELEC...
    程式設計 發佈於2024-11-08
  • 了解 JavaScript 中的非同步程式設計:事件循環初學者指南
    了解 JavaScript 中的非同步程式設計:事件循環初學者指南
    Have you ever wondered why some pieces of JavaScript code seem to run out of order? The key to understanding this is the event loop. JavaScript's even...
    程式設計 發佈於2024-11-08
  • 如何使用 multiprocessing.Manager 在多個進程之間共用結果佇列?
    如何使用 multiprocessing.Manager 在多個進程之間共用結果佇列?
    使用multiprocessing.Manager 在多個進程之間共享結果隊列在多處理中,父子進程之間共享隊列對於通訊和結果檢索至關重要。然而,使用 apply_async 啟動非同步工作進程在共享佇列方面提出了挑戰。 為了克服「佇列物件只能透過繼承在進程之間共享」錯誤,我們可以利用 multipr...
    程式設計 發佈於2024-11-08
  • 如何在Visual Studio Code中設定Python調試的工作目錄?
    如何在Visual Studio Code中設定Python調試的工作目錄?
    如何設定使用 VS Code 的調試器調試 Python 程式的工作目錄? 使用 Visual Studio Code 偵錯 Python 程式時 ( VS Code),指定工作目錄對於確保腳本正確運作至關重要。 要在啟動設定檔(launch.json) 中設定工作目錄,請依照下列步驟操作: 開啟l...
    程式設計 發佈於2024-11-08
  • 為什麼 Matplotlib 的動畫程式碼要使用尾隨逗號?
    為什麼 Matplotlib 的動畫程式碼要使用尾隨逗號?
    揭開Matplotlib動畫中的尾隨逗號:它是逗號運算子嗎? 在使用Matplotlib創建簡單動畫的程式碼片段中,變數行後面可以觀察到逗號:line, = ax.plot(x, np.sin(x))這個逗號讓一些開發者感到困惑,導致有人質疑它是否代表逗號運算子。 消除逗號運算子神話此上下文中的尾隨...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3