java基礎(16)、數組的高級應用--冒泡排序、選擇排序

来源:https://www.cnblogs.com/yiwanfan/archive/2018/04/18/8878661.html
-Advertisement-
Play Games

數組排序 目錄 一. 冒泡排序 二. 選擇排序 三. 優化選擇排序 一. 冒泡排序 將數組元素按【從小到大排序】為例 思路:依次對臨近的兩個元素對比,將最大值放在數組最後;再將剩餘的元素對比,大值放在剩餘元素的最後. . . 以此迴圈,最後元素就是按從小到大排列。 1.1. 做之前,先瞭解這個操作: ...


數組排序

目錄

一.  冒泡排序

二.  選擇排序

三.  優化選擇排序

 


 

一.  冒泡排序

將數組元素按【從小到大排序】為例

  思路:依次對臨近的兩個元素對比,將最大值放在數組最後;再將剩餘的元素對比,大值放在剩餘元素的最後. . . 以此迴圈,最後元素就是按從小到大排列。

1.1.  做之前,先瞭解這個操作:把數組的最大值放在末尾

  將元素1和元素2對比,如果元素1的值大,則元素2和元素1的值互換(此時元素2為大值);再讓元素2和元素3對比.  . ( 保留大值).  .  元素3和元素4對比 .  .  .  依次類推,對比完全部的元素後(因是按照當前元素和下一個元素進行的對比,所以當前元素為倒數第二個元素時,就可完成全部的元素對比,也就是對比了【數組長度-1次】),則最後的元素就是最大值;

1             for (int i = 0; i < arr.length - 1; i++) {
2                 //若當前元素比下一個元素大,則將這兩個元素互換
3                 if(arr[i] > arr[i+1]){    
4                     int temp = arr[i];
5                     arr[i] = arr[i+1];
6                     arr[i+1] = temp;
7                 }

 

 

1.2.  【1.1】的基礎上,將其餘的元素按照從小到大迴圈排序:

  使用【1.1】的方法,將剩下的元素再進行最大值的對比(對比的次數比【1.1】的少一次,就可進行剩餘元素的對比);按此思路迴圈即可(迴圈一次,大值就放在【迴圈元素的】後面;當迴圈到第二個元素時,第一個元素就是最小值,也就是迴圈了【數組長度-1次】)。

 1         int[] arr = {1,3,5,1,2,7,9};
 2         //2、迴圈一次,就將一個大值放在數組後面;當迴圈到第二個元素時,第一個元素就已經是最小值,故迴圈【數組長度 - 1次】即可。
 3         for(int j = 0 ;j < arr.length - 1 ;j++){    
 4             for (int i = 0; i < arr.length - 1 - j; i++) {
 5                 //1、若當前元素比下一個元素大,則將這兩個元素互換
 6                 if(arr[i] > arr[i+1]){    
 7                     int temp = arr[i];
 8                     arr[i] = arr[i+1];
 9                     arr[i+1] = temp;
10                 }
11             }
12         }
13         for (int i = 0; i < arr.length; i++) {
14             System.out.print(arr[i]+" ");
15         }

 

 


 

二.  選擇排序法

將數組元素按【從小到大排序】為例

  思路:將第一個元素與之後的元素對比,若有值比其大的元素,則將這兩個元素互換(保證第一個元素為最小值);然後第二個元素與之後的元素對比 . .  . 依次迴圈。

2.1.  做之前,先瞭解這個操作:將數組的最小值放在最前面

   思路:將第一個元素,與之和的元素挨個對比,期間若有值比其大的元素,則將這兩個元素互換(迴圈到【數組長度-1次】後,則完成所有元素的對比)。

        for (int i = 0; i < arr.length - 1; i++) {
            //如果第一個元素比之後的元素大,則和其元素互換,迴圈完畢後,arr[0]是數組的最小值。
            if(arr[0] > arr[i+1]){
                int temp = arr[0];
                arr[0] = arr[i + 1];
                arr[i + 1] = temp;
            }
        }

 

 

2.2.  【2.1】 的基礎上,將其餘的元素按照從小到大迴圈排序:

  使用【2.1】的(內部)迴圈後,再將第二個元素與之後的所有元素進行對比(因是第二元素個開始,故迴圈的次數比【2.1】少一次),按此思路(外部)迴圈即可(每次迴圈對比的次數,都比上一次少一次)

  分析1:(外部)迴圈第一次,用第一個元素和其他元素對比;迴圈第二次,用第二個元素與其他元素對比 .  .  .    故(外部)迴圈的次數【i】與做對比的元素索引符合【arr[i]】

  分析2:(內部)迴圈對比的次數,每次比上次少一次,將外部迴圈的次數【i】,符合內部迴圈的迴圈初始值。 

 1         int[] arr = {1,3,5,1,2,7,9};
 2         
 3         for (int j = 0; j < arr.length; j++) {
 4             //2、因每完成一次迴圈,下次迴圈次數需要少一次;外部迴圈的值給內部迴圈,可達到該效果
 5             for (int i = j; i < arr.length - 1; i++) {
 6                 //1、如果第一個元素比之後的元素大,則和其元素互換,迴圈完畢後,arr[j]是其在內與之後元素中的的最小值。
 7                 if(arr[j] > arr[i+1]){
 8                     int temp = arr[j];
 9                     arr[j] = arr[i + 1];
10                     arr[i + 1] = temp;
11                 }
12             }
13         }

 

 


 

三.   優化選擇排序法

將數組元素按【從小到大排序】為例

  因選擇排序法需要進行某元素與之後所有的元素對比,併進行元素互換的過程,若數組的長度很長,則元素互換需要耗費較多資源

  優化思路:再選擇排序法的基礎上,設置變數index(代表起點對比元素的索引),和變數value(代表起點元素的值),當出現比其值小的元素時,將該元素的值和索引賦值給變數(賦值耗費的資源大大低於元素互換);然後將代表最小值的變數索引與起點元素索引對比,若不相同,則將起點元素與最小值元素互換(這樣迴圈下去,以較少的元素互換次數,即可完成排序)。

 1         for (int i = 0; i < arr.length - 1; i++) {
 2             int index = i;
 3             int value = arr[i];
 4             //若出現比起點元素值更好的元素,將該元素的索引和值賦給起點元素變數。
 5             for (int j = i + 1; j < arr.length; j++) {
 6                 if (value > arr[j]) {
 7                     value = arr[j];
 8                     index = j;
 9                 }
10             }
11             //若最小值的索引(index)與起點索引不同,則將最小值的元素和起點元素互換
12             if (i != index) {
13                 int temp = arr[i];
14                 arr[i] = arr[index];
15                 arr[index] = temp;
16             }
17         }

 

 

 


 

 


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

-Advertisement-
Play Games
更多相關文章
  • 在進行網頁數據抓取時我們要先安裝一個模塊 requests 通過終端安裝如下圖 因為我之前安裝過了,所以不會顯示安裝進度條,安裝也非常簡單,如果你配置好環境變數的話,你只需要執行以下命令 如果提示要升級,就按下麵升級pip 安裝完模塊後我們正式開始進行數據爬取 先說一下requests的用法,導入這 ...
  • 用for迴圈對無序數組進行排序輸出。 public class BubbleSort{ public static void main (String [] args){ int a[] = {21,9,45,17,33,72,50,12,41,39}; for (int i=a.length; - ...
  • MyBatis—Spring 項目 目前大部分的 Java 互聯網項目,都是用 Spring MVC + Spring + MyBatis 搭建平臺的。 使用 "Spring IoC" 可以有效的管理各類的 Java 資源,達到即插即拔的功能;通過 "Spring AOP" 框架,資料庫事務可以委托 ...
  • 內容:日曆對象獲取時間,設置時間,日期偏移 通過工廠化獲得對象。getInstance();get() 獲取時間信息 美國的星期是從星期天開始的,所以會有點問題set()設置方法,設置時間 //解答三月一日的前一天就是 Calendar c = Calendar.getInstance(); int ...
  • 集合的迭代器 任何集合都有迭代器。 任何集合類,都必須能以某種方式存取元素,否則這個集合容器就沒有任何意義。 迭代器,也是一種模式(也叫迭代器模式)。在java中它是一個對象,其目的是遍歷並選中其中的每個元素,而使用者(客戶端)無需知道裡面的具體細節。迭代器要足夠的“輕量”——創建迭代器的代價小。所 ...
  • Github項目地址: https://github.com/JtvDeemo/elementary arithmetic PSP ||||| |: |: |: |: | | PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘 ...
  • SocketServer其實是對socket更高級的封裝正如官網上說的:The socketserver module simplifies the task of writing network servers. 我們可以先打開以下SocketServer的源碼,看一下源碼中整體的框架 從上圖我們 ...
  • 比如:如果在微信小程式中要遍歷輸出 0-9 的數,我們會使用for迴圈 確實結果也是這樣: 但是,如果我在迴圈時同時調用wx的api介面10次,那麼輸出的結果就會不同(這是產生了閉關的效應) eg:每次調用一次wx.showToast()介面,併在成功時輸出迴圈的值。 結果: 可以看到輸出了10次1 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...