交換排序——選擇排序和冒泡排序的區別是什么?

今天重溫一下算法,其實剛開始我覺得冒泡排序和選擇排序是一樣的,因為他們排序過程中都是通過相鄰的數據比較找到最小/最大的數據,通過不斷思考和學習才明白,兩者還是有區別的。

冒泡排序

概念

冒泡排序(Bubble Sort),可以說是知名度最高也是特別特別重要的經典排序算法。

冒泡排序和選擇排序都屬于交換排序算法的一種。所謂交換排序算法,是指在排序過程中,要發生數組元素的交換。

之所以要把該算法稱為“冒泡算法”,這是因為每個大的元素,每次經過交換都會慢慢“浮”到數組的頂端,故名“冒泡排序”。

冒泡排序的核心思想,是把相鄰的元素進行兩兩比較,當一個元素大于右側相鄰的元素時,就交換它們的位置;當一個元素小于或等于右側相鄰的元素時,則保持位置不變。

注意:冒泡排序只會操作相鄰的兩個數據。每次冒泡操作都是對相鄰的兩個元素進行比較,看是否滿足大小關系。

實現步驟

接下來我們就以一個數值型的數組為例,向大家介紹冒泡排序的整個排序過程。

我們現在定義一個數組,其數組元素值依次為[5,8,6,3,9,2,1,7]

如果我們采用冒泡排序算法,按從小到大的規則對其排序,其詳細過程會如下所示:

  1. 將5和8進行比較,因為滿足左小右大的規則,不需要交換,保持元素位次不變;
  2. 將8和6進行比較,因不滿足左小右大的規則,則需要交換。將8和6位置互換,互換位置后,元素6在下標1這個位置上,元素8在下標2這個位置上;
  3. 接著將8和3進行比較,不滿足左小右大規則,需要交換。將8和3位置互換,互換位置后,元素3在下標2的位置上,元素8在下標3的位置上;
  4. 繼續將8和9進行比較,滿足左小右大規則,不需要交換,保持元素位次不變;
  5. 將9和2進行比較,不滿足左小右大的規則,需要交換。將9和2位置互換,互換位置后,元素2在下標4的位置上,元素9在下標5的位置上;
  6. 將9和1進行比較,不滿足左小右大的規則,需要交換。將9和1位置互換,互換位置后,元素1在下標5的位置上,元素9在下標6的位置上。
  7. 繼續將9和7進行比較,不滿足左小右大的規則,需要交換。互換位置后,元素7在下標6的位置上,元素9在下標7的位置上。

如果我們把上述的文字描述,轉換為圖片,則會如下圖所示:

這樣就完成了第一輪的交換比較。經過第一輪交換后,元素9作為數列中最大的元素,就像是汽水里的氣泡一樣浮到了最右側。接著我們繼續如此重復上述的比較過程,每一輪結束后,都會有一個本輪最大的元素被移到了最右側,如下所示:

每一輪的排序結果最終會如上圖所示,所以最終的排序結果就是最后一排的數值結果。

最后我們來總結下,冒泡排序算法的3個核心步驟:

  • 比較相鄰的元素。如果第一個元素比第二個元素大,就將兩者交換;

  • 對每一對相鄰的兩個元素進行同樣的操作。從開始第一對到結尾的最后一對,最后的元素就是最大的數。

  • 針對所有元素重復以上步驟。每重復一輪上述步驟,需要操作的元素就會越來越少,直到沒有任何一對元素需要比較。

代碼實現

算法步驟

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再從剩余未排序元素中繼續尋找最小(大)元素,然后放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。代碼如下所示:

Array.prototype.bubble_sort = function() {var i, j, temp;for (i = 0; i < this.length - 1; i++)for (j = 0; j < this.length - 1 - i; j++)if (this[j] > this[j + 1]) {temp = this[j];this[j] = this[j + 1];this[j + 1] = temp;}return this;
}

選擇排序

概念

選擇排序(Selection Sort) 是一種最簡單直觀的排序算法。即使在我們的日常生活中,大家可能都會經常無意地進行選擇排序。

例如:我們去超市買西紅柿,拿了一個袋子,從眾多的西紅柿中挑了一個最大好的放入袋中,然后又從剩下的西紅柿中挑了一個最大的放入袋子。這樣如此反復,直到挑夠了需要的西紅柿去結賬。這其實就是選擇排序的實現思想,就是不斷地從未排序的元素中選擇最大(或最小)的元素,放入到已排好序的元素集合中,直到未排序的元素為空。

基于上述實現思想,我們就可以提取出選擇排序的實現原理:

將一個數組分成有序的區間和無序的區間兩部分,初始時有序區間為空,每次從無序區間中選出最小的元素,并放到有序區間的末尾,直到無序區間為空。

實現步驟

假如我們現在有一個待排序的數組[5,8,6,3,9,2,1,7]

若采用選擇排序算法進行排序,其實現步驟如下:

  1. 初始化待排序數組[5,8,6,3,9,2,1,7];
  2. 從待排序數組中,選出最小值1,和第一個元素5進行交換,即將最小的元素放在下標0的位置上;
  3. 在剩下的無序區間的元素中,選擇最小的元素2,并將最小的元素2與無序區間的第一個元素8進行交換。交換后,有序區間的元素變為2個,分別是1和2,剩余的為無序區間。
  4. 依次類推,將所有的元素通過不斷選擇的方式,按有序的方式放到有序區間,最終把整個數組全部排好順序。

我們把上述選擇排序的文字描述內容,變成對應的圖片,會如下圖所示:

代碼實現

算法步驟

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再從剩余未排序元素中繼續尋找最小(大)元素,然后放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。代碼如下:

function selectionSort(arr) {var len = arr.length;var minIndex, temp;for (var i = 0; i < len - 1; i++) {minIndex = i;for (var j = i + 1; j < len; j++) {if (arr[j] < arr[minIndex]) {     // 尋找最小的數minIndex = j;                 // 將最小數的索引保存}}temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}return arr;
}

總結

  • 冒泡排序屬于交換排序算法的一種;

  • 選擇排序算法是原地排序算法的一種;

  • 冒泡排序的核心思想是把相鄰的元素進行兩兩比較,當一個元素大于右側相鄰的元素時,就交換它們的位置;當一個元素小于或等于右側相鄰的元素時,則保持位置不變。

  • 選擇排序的實現思想,就是不斷地從未排序的元素中選擇最大(或最小)的元素,放入到已排好序的元素集合中,直到未排序的元素為空。

兩者的區別簡單了說就是冒泡排序在比較的過程中待排序的數據會發生位置改變,而選擇排序法在比較過程中,是記錄較大/較小數據的索引,只有在找到最大/最小數據的時候才會發生交換。?

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

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

相關文章

SpringBoot使用thymeleaf模版引擎配置自定義錯誤頁面

1、要在Spring Boot項目中配置自定義的錯誤頁面&#xff0c;你可以遵循以下步驟&#xff1a; 1.1、pom.xml引入thymeleaf <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId><…

【正版系統】2023熱門短劇SAAS版開源 | 小程序+APP+公眾號H5

當我們在刷百度、D音、K手等各種新聞或短視頻時經常會刷到劇情很有吸引力的短劇廣告&#xff0c;我們點擊廣告鏈接即可進入短劇小程序&#xff0c;小程序運營者通過先免費看幾集為誘耳然后在情節高潮時彈出充值或開VIP會員才能繼續看的模式來賺錢&#xff0c;以超級贅婿、鄉村小…

VS Code中C++程序的調試(Debug)功能

有一個.vscode文件&#xff0c;存放當前工作區相關配置文件的目錄。 launch.json {"version": "0.2.0","configurations": [{"name": "gcc.exe - 生成和調試活動文件", // 該調試任務的名字&#xff0c;啟動調試時會在待…

TCP/IP 下的計算機網絡江湖

〇、引言 在當今數字化時代,計算機網絡宛如廣袤江湖,涵蓋著五大門派:物理層、數據鏈路層、網絡層、傳輸層和應用層。每個門派獨具技能,共同構筑著現代網絡的框架。物理層宛如江湖基石,將比特流傳輸;數據鏈路層如武林傳承,組織數據幀傳遞;網絡層則像導航大師,尋找傳送路…

使用阿里云服務器搭建PostgreSQL主從架構圖文流程

阿里云百科分享使用阿里云服務器搭建PostgreSQL主從架構圖文流程&#xff0c;PostgreSQL被業界譽為最先進的開源數據庫&#xff0c;支持NoSQL數據類型&#xff08;JSON/XML/hstore&#xff09;。本文檔介紹在CentOS 7操作系統的ECS實例上搭建PostgreSQL主從架構的操作步驟。 目…

【Linux操作系統】文件描述符fd

&#x1f525;&#x1f525; 歡迎來到小林的博客&#xff01;&#xff01; ??????&#x1f6f0;?博客主頁&#xff1a;??林 子 ??????&#x1f6f0;?博客專欄&#xff1a;?? Linux之路 ??????&#x1f6f0;?社區 :?? 進步學堂 ??????&#x1…

python單元測試框架(測試固件、批量執行)

python測試框架 在Python語言中應用最廣泛的單元測試框架是unittest和pytest,unittest屬于標準庫&#xff0c;只要安裝了Python解釋器后就可以直接導入使用了,pytest是第三方的庫&#xff0c;需要單獨的安裝。 1.白盒測試原理 在軟件架構的層面來說&#xff0c;測試最核心的…

Kotlin入門:變量和函數——02

目錄 一、Kotlin 基本數據類型 ?編輯 二、變量 val 關鍵字&#xff1a; var 關鍵字: 類型推斷: 可空類型: 三、函數 基本函數語法&#xff1a; 單表達式函數&#xff1a; 默認參數值&#xff1a; 命名參數&#xff1a; 一、Kotlin 基本數據類型 Kotlin 的基本數…

vue數據更新table內容不更新解決方法

場景&#xff1a; table組件綁定的數據變化時&#xff0c;頁面沒有重新渲染&#xff0c;常見于子組件中使用table組件 原理&#xff1a; 創建實例時 數組在vue中沒有被監聽到&#xff0c;屬于非響應式數據&#xff0c;數組的下標變化無法監聽到 解決方式&#xff1a; <e…

SpringSecurity如何放行資源

SpringSecurity配置放行資源 permitAll配置實例 EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter {Overridepublic void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/css/**", …

數據庫事務ACID介紹

一、ACID簡介 ACID&#xff0c;是指數據庫管理系統&#xff08;DBMS&#xff09;在增刪改數據的的過程中&#xff0c;為保證事務&#xff08;transaction&#xff09;的準確性&#xff0c;可靠性等&#xff0c;所必須具備的四個特性&#xff1a;原子性&#xff08;atomicity&a…

【MFC】09.MFC視圖-筆記

MFC視圖窗口&#xff1a;CView類 顯示數據/畫面 我們之前的繪圖消息&#xff0c;都是在框架類上畫出來的 視圖窗口就覆蓋在框架窗口上 視圖窗口本質上也是窗口&#xff0c;只是和框架窗口風格不同 CView類也繼承于CWnd類 CView也能處理消息&#xff0c;因為它繼承于CWnd類…

關于selenium 元素定位的淺度解析

一、By類單一屬性定位 元素名稱 描述 Webdriver API id id屬性 driver.find_element(By.ID, "id屬性值") name name屬性 driver.find_element(By.NAME, "name屬性值") class_name class屬性 driver.find_element(By.CLASS_NAME, "class_na…

25考研:跨專業考研難嗎?

25考研&#xff1a;跨專業考研難嗎&#xff1f; 嘉興校址&#xff1a;嘉興市南湖區中山東路205號嘉華廣場4樓 &#xff08;建國珠寶城旁&#xff09;上元教育 海寧校址&#xff1a;海寧市西山路832號金貿大廈11樓1101號上元教育 桐鄉校址&#xff1a;桐鄉市東悅路吾悅廣場156號…

MAUI+Blazor:隱藏標題欄和問題

文章目錄 前言相關文章代碼問題有必要解決嗎&#xff1f; 前言 最近在研究MAUIBlazor開發&#xff0c;發現一個問題&#xff0c;原生的的標題欄實在是太丑了。 相關文章 MAUI桌面端標題欄設置和窗口調整 MAUI Windows How to completely hide the TitleBar? #15142 MAUI …

Chrome開發者工具介紹

Chrome開發者工具介紹 前言1 打開DevTools2 命令菜單3 Elements面板ConsoleJavaScript調試Network 前言 Chrome開發者工具是谷歌瀏覽器自帶的一款開發者工具&#xff0c;它可以給開發者帶來很大的便利。常用的開發者工具面板主要包含Elements面板、Console面板、Sources面板、…

數據結構——時間復雜度和空間復雜度

1.算法效率 2.時間復雜度 3.空間復雜度 4. 常見時間復雜度以及復雜度oj練習 1.算法效率 1.1 如何衡量一個算法的好壞 如何衡量一個算法的好壞呢&#xff1f;比如對于以下斐波那契數的計算 long long Fib(int N) { if(N < 3) return 1; return Fib(N-1) Fib(N-2); }我們看到…

2023 互聯網大廠薪資大比拼

最近整理了33家互聯網大廠的薪資情況。可以看出來&#xff0c;大部分互聯網大廠薪資還是很不錯的&#xff0c;騰訊、阿里、美團、百度等大廠平均月薪超過30k&#xff0c;其他互聯網大廠平均月薪也都在25k以上。01020304050607080910111213141516171819202122232425262728293031…

yo!這里是STL::list類簡單模擬實現

目錄 前言 重要接口實現 框架 默認成員函數 迭代器&#xff08;重點&#xff09; 1.引言 2.list迭代器類實現 3.list類中調用實現 增刪查改 后記 前言 我們知道&#xff0c;stl中的vector對應數據結構中的順序表&#xff0c;string類對應字符串&#xff0c;而今天要…

Unity C# 之 Http 獲取網頁的 html 數據,并去掉 html 格式等相關信息

Unity C# 之 Http 獲取網頁的 html 數據&#xff0c;并去掉 html 格式等相關信息 目錄 Unity C# 之 Http 獲取網頁的 html 數據&#xff0c;并去掉 html 格式等相關信息 一、簡單介紹 二、實現原理 三、注意事項 四、效果預覽 五、關鍵代碼 一、簡單介紹 Unity中的一些知…