Java快速排序演算法

来源:http://www.cnblogs.com/zhouguanglin/archive/2017/07/23/7223463.html
-Advertisement-
Play Games

快速排序演算法思想: 快速排序(Quicksort)是對冒泡排序的一種改進。 快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序 ...


快速排序演算法思想:

快速排序(Quicksort)是對冒泡排序的一種改進。 快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。 用一個演算法排序圖形象表示了快速排序

一趟快速排序的演算法是:

1)設置兩個變數i、j,排序開始的時候:i=0,j=N-1; 2)以第一個數組元素作為關鍵數據,賦值給key,即key=A[0]; 3)從j開始向前搜索,即由後開始向前搜索(j--),找到第一個小於key的值A[j],將A[j]和A[i]互換; 4)從i開始向後搜索,即由前開始向後搜索(i++),找到第一個大於key的A[i],將A[i]和A[j]互換; 5)重覆第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中A[j]不小於key,4中A[i]不大於key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到為止。找到符合條件的值,進行交換的時候i, j指針位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令迴圈結束)

最通俗的講法:

取第一個數跟數組中的其他數比較,小的在左邊大的在右邊,就這樣一直遞歸排序

排序的基本過程

以數組{49,38,65,97,76,13,27,49}為例,選擇第一個元素49為基準 
初始化關鍵字: [49,38,65,97,76,13,27,49]     這裡寫圖片描述  

 代碼實現:

 1 public static void main(String[] args) {
 2         // TODO Auto-generated method stub
 3          int a[] = {49, 38, 65, 97, 76, 13, 27, 49};//設置一個數組
 4          sort(a,0,a.length-1);                                               //調用快速排序方法
 5          System.out.println(Arrays.toString(a));                //將快速排序過的數組輸出
 6     }
 7      public static void sort(int a[], int left, int right) {
 8             int i, j, key;
 9             if (left > right) {   //這個判斷很重要的,有這個才會在函數遞歸的時候跳出
10                 return;
11             }
12             i = left;                //左邊第一位開始
13             j = right;            //右邊最後一位
14             key = a[i];     //用數組的第一位數做為參考數
15             while (i < j) {   // 從數組的兩端交替向中間掃描
16                 while (i < j && a[j] >= key){    //從右邊開始掃描
17                     j--;
18                     }
19                 //跳出迴圈說明右邊這個點的數有比參考數小,所以兩個數互換位子,小的到左邊
20                     a[i] = a[j];
21                 while (i<j && a[i]< key){   //再從左邊掃描
22                     i++;
23                     }
24                 //跟上面同理,只是相反
25                     a[j] = a[i];
26              }
27             a[i] = key;        //這是迴圈到最後的時候 a[j] = a[i];產生重覆,i的位置的數應該是key,所以替換回來
28             sort(a, left, i - 1);         // 對小於key一邊的遞歸排序
29             sort(a, i + 1, right);      // 對高於key一邊的遞歸排序
30             //直到兩邊排序完畢,在以上中的if判斷中跳出這個方法成功快速排序
31         }

 


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

-Advertisement-
Play Games
更多相關文章
  • 捲積神經網路(Convolutional Neural Network,CNN),可以解決圖像識別、時間序列信息問題。深度學習之前,藉助SIFT、HoG等演算法提取特征,集合SVM等機器學習演算法識別圖像。 SIFT,縮放、平移、旋轉、視角轉變、亮度調整畸變的一定程度內,具有不變性。有局限性,Image ...
  • shelve模塊 shelve類似於一個key-value資料庫,可以很方便的用來保存Python的記憶體對象,其內部使用pickle來序列化數據,簡單來說,使用者可以將一個列表、字典、或者用戶自定義的類實例保存到shelve中,下次需要用的時候直接取出來,就是一個Python記憶體對象,不需要像傳統數 ...
  • 程式聲明將整型變數的類型告訴了C++編譯器,但編譯器如何知道常量類型呢? 除非有理由(如使用特殊尾碼,或者值太大無法存儲為int),不然都將存儲為int類型 尾碼是放在數字常量後面的字母 l、L表示long常量 u、U表示unsigned int ul(UL)或lu(LU)表示unsigned in ...
  • 我們以騰訊社招頁面來做示例:http://hr.tencent.com/position.php?&start=0#a 如上圖,使用BeautifulSoup4解析器,將圖1中229頁,每頁10個招聘信息,共2289個招聘信息中的職位名稱、職位類別、招聘人數、工作地點、工作職責、工作要求、詳情鏈接等 ...
  • Message Digest Algorithm MD5(中文名為消息摘要演算法第五版)為電腦安全領域廣泛使用的一種散列函數,用以提供消息的完整性保護。該演算法的文件號為RFC 1321(R.Rivest,MIT Laboratory for Computer Science and RSA Data ...
  • 在我們做後臺刪除的時候,當點擊刪除標簽時,你希望彈出一個友好的提示框!比如這樣: 那代碼應該怎樣寫呢?向下麵這樣? 你會發現會發生這樣一個錯誤: 該函數沒有被使用?不應該啊,我在php裡面不是已經調用了麽? 註意: 想必寫過前端的人都知道這個方法是在頁面全部載入完成之後執行,那麼問題就來了,php的 ...
  • shutil模塊 高級的 文件、文件夾、壓縮包 處理模塊 os模塊提供了對目錄或者文件的新建/刪除/查看文件屬性,還提供了對文件以及目錄的路徑操作。比如說:絕對路徑,父目錄…… 但是,os文件的操作還應該包含移動 複製 打包 壓縮 解壓等操作,這些os模塊都沒有提供。 而本文所講的shutil則就是 ...
  • sys模塊 sys模塊是處理與系統相關的模塊,sys(system),下麵來看看sys模塊常用的方法: 1、sys.argv #命令行參數list,第一個元素是程式本身路徑 2、sys.exit(n) #退出程式,正常退出時exit(0) 功能:執行到主程式末尾,解釋器自動退出,但是如果需要中途退出 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...