圖解選擇排序與插入排序

上一篇詳述了冒泡排序及其優化,有興趣的可以看看:

如何優化冒泡排序?

一、選擇排序(SelectionSort)

  • 算法思想:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再從剩余未排序元素中繼續尋找最小(大)元素,然后放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。
  • 排序過程:(默認升序)
  1. 從原序列中找到最小值,與數組第一個元素交換;
  2. 除第一個元素外,從剩下未排序的序列中找到最小值,與數組第二個元素交換;
  3. 共N-1趟,每趟都找到未排序的最小值,放到已排序的序列后面。

如圖所示,每一趟找到未排序的最小值,并放到有序序列的后面(即當前趟對應于數組中的第幾個元素)。

  • java實現選擇排序
?private?static?<T?extends?Comparable<??super?T>>?void?selectionSort(T[]?nums)?{
????????if?(null?==?nums?||?nums.length?==?0)?{
????????????throw?new?RuntimeException("數組為null或長度為0");
????????}
????????int?length?=?nums.length;
????????int?minValueIndex?=?0;
????????T?temp?=?null;
????????for?(int?i?=?0;?i?<?length?-?1;?i++)?{
????????????minValueIndex?=?i;
????????????for?(int?j?=?i?+?1;?j?<?length;?j++)?{
????????????????if?(nums[j].compareTo(nums[minValueIndex])?<?0)?{
????????????????????minValueIndex?=?j;
????????????????}
????????????}
????????????if?(minValueIndex?!=?i)?{
????????????????temp?=?nums[i];
????????????????nums[i]?=?nums[minValueIndex];
????????????????nums[minValueIndex]?=?temp;
????????????}
????????}
????}
復制代碼
  • 時間、空間復雜度及穩定性分析:
  1. 最好時間復雜度:最好情況是輸入序列已經升序排列,需要比較n*(n-1)/2次,但不需要交換元素,即交換次數為:0;所以最好時間復雜度O(n^2)
  2. 最壞時間復雜度:最壞情況是輸入序列是逆序的,則每一趟都需要交換。即需要比較n*(n-1)/2次,元素交換次數為:n-1次。所以最壞時間復雜度還是O(n^2)
  3. 平均時間復雜度:O(n^2)
  4. 空間復雜度:只用到一個臨時變量,所以空間復雜度O(1)
  5. 穩定性:不穩定排序。如序列3,5,3,1。第一次交換結果為1,5,3,3,我們發現原序列的第一個3排在了第二個3的后面。

二、插入排序(InsertSort)

  • 算法思想:通過構建有序序列,對于未排序數據,在已排序序列中從后向前掃描,找到相應位置并插入。插入排序因而在從后向前掃描過程中,需要反復把已排序元素逐步向后挪位,為最新元素提供插入空間。

  • 排序過程:(默認升序)

    InsertionSort 和打撲克牌時,從牌桌上逐一拿起撲克牌,在手上排序的進程相同。

    舉例:

    Input: {4, 3, 8, 5, 2, 6, 1, 7}。

  1. 首先拿起第一張牌, 手上有 {4}。

  2. 拿起第二張牌 3, 把 3insert 到手上的牌 {4}, 得到 {3 ,4}。

  3. 拿起第三張牌 8, 把 8 insert 到手上的牌 {3,4 }, 得到 {3 ,4,8}。

  4. 以此類推。

    插入排序由N-1趟排序組成。對于p=1到N-1趟排序后,插入排序保證從位置0到位置p上的元素為已排序狀態。即插入排序利用了從位置0到p-1位置上已經有序的條件,將位置p上的元素向前查找適當的位置插入此元素。

    如圖所示:在第p趟,我們將位置p上的元素向左移動,直到它在前p+1個元素(包括當前位置的元素)中的正確位置被找到。

  • java實現插入排序

    private?static?<T?extends?Comparable<??super?T>>?void?insertSort(T[]?nums)?{
    ??????if?(null?==?nums?||?nums.length?==?0)?{
    ??????????throw?new?RuntimeException("數組為null或長度為0");
    ??????}
    ??????int?length?=?nums.length;
    ??????T?temp?=?null;
    ??????int?i?=?0;
    ??????for?(int?p?=?1;?p?<?length;?p++)?{
    ??????????temp?=?nums[p];
    ??????????for?(i?=?p;?i?>?0?&&?(temp.compareTo(nums[i?-?1])?<?0);?i--)?{
    ??????????????nums[i]?=?nums[i?-?1];
    ??????????}
    ??????????nums[i]?=?temp;
    ??????}
    ??}
    復制代碼
  • 時間、空間復雜度及穩定性分析:

  1. 最好時間復雜度:最好情況就是,序列已經是升序排列了,在這種情況下,需要進行的比較操作需n-1次即可。即最好時間復雜度O(n)
  2. 最壞時間復雜度:最壞情況就是,序列是降序排列,那么總共需要n(n-1)/2次比較;移動次數(賦值操作)是比較次數減去n-1次(因為每一次循環的比較都比賦值多一次,共n-1次循環),即n(n-1)/2 - (n-1);所以最壞時間復雜度O(n^2)
  3. 平均時間復雜度:O(n^2)
  4. 空間復雜度:只用到一個臨時變量,所以空間復雜度O(1)
  5. 穩定性:穩定。

三、總結

? 選擇排序的主要優點與數據移動有關。如果某個元素位于正確的最終位置上,則它不會被移動。選擇排序每次交換一對元素,它們當中至少有一個將被移到其最終位置上,因此對n個元素的表進行排序總共進行n-1次交換。在所有的完全依靠交換去移動元素的排序方法中,選擇排序屬于非常好的一種。選擇排序最好、最壞時間復雜度都為O(n^2),空間復雜度為O(1),屬于不穩定排序。

? 插入排序不適合對于數據量比較大的排序應用。但是,如果需要排序的數據量很小,例如,量級小于千;或者若已知輸入元素大致上按照順序排列,那么插入排序還是一個不錯的選擇。插入排序最好時間復雜度為O(n)、最壞時間復雜度為O(n^2),空間復雜度為O(1),屬于穩定排序。

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

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

相關文章

2011年上半年網頁游戲開測數據報告發布

網頁游戲上半年統計數據顯示&#xff0c;2011年上半年&#xff0c;網頁游戲開測信息總數為304款&#xff0c;排除重復開測信息&#xff0c;在2011年1月1日至6月30日這段期間&#xff0c;共收錄開測&#xff08;含首次開測或更名的&#xff09;的數據為129條。 新公布的產品&…

計算機python程序設計導論,程序設計導論:Python計算與應用開發實踐(原書第2版)...

程序設計導論&#xff1a;Python計算與應用開發實踐(原書第2版)語音編輯鎖定討論上傳視頻《程序設計導論&#xff1a;Python計算與應用開發實踐(原書第2版)》是2018年機械工業出版社出版的圖書&#xff0c;作者是[美] 盧博米爾佩爾科維奇(Ljubomir Perkovic)。書 名程序設計…

vue-cli 將被 create-vue 替代?初始化基于 vite 的 vue3 項目為何如此簡單?

大家好&#xff0c;我是若川。最近組織了源碼共讀活動《1個月&#xff0c;200人&#xff0c;一起讀了4周源碼》&#xff0c;已經有超50人提交了筆記&#xff0c;群里已經有超1500人&#xff0c;感興趣的可以點此鏈接掃碼加我微信 ruochuan12create-vue公開了&#xff0c;可以使…

lynda ux_如何進入UX領域

lynda uxI often get asked “What is the right path I should take to get into UX?” and more often than not, I do not have a direct answer. I usually ask a lot of questions about their background, before assessing their current skills with the things they …

php字符串學習筆記

在這里記錄下今天的所得首先對字符串處理進行分類今天主要記錄有以下字符串的格式化字符串的連接與分割字符串的比較使用字符串函數匹配和替換子字符串使用正則表達式1.字符串的格式化<?php //整理字符串的第一步是清理字符串中的多余的空格 // trim() ltrim() rtrim() // …

This is a Blog Test

Blog Test Hello, everyone! I am going to write blog to record the knowledge about the computer technology involved when I study. Please feel free to comment on any mistakes. Thank you! print("Hello")轉載于:https://blog.51cto.com/12370958/2379111

可以測試體育跑步的軟件,某高校現跑步打卡神器 能檢測出是在走還是跑

[摘要]近日&#xff0c;一批高大上的“陽光跑步神器”在東莞一所高校火了&#xff01;之所以稱之“神器”&#xff0c;是由于這批機器能檢測到你在走路還是在跑步&#xff0c;如果走路數據將中斷。消息一出&#xff0c;學生們有贊成&#xff0c;也有大呼“吃不消”。東莞某高校…

一道很熟悉的前端面試題,你怎么答?

大家好&#xff0c;我是若川。最近這幾年&#xff0c;云計算的普及和 HTML5 技術的快速發展&#xff0c;越來越多的應用轉向了瀏覽器 / 服務器&#xff08;B/S&#xff09;架構&#xff0c;這種改變讓瀏覽器的重要性與日俱增&#xff0c;視頻、音頻、游戲幾大核心場景也都在逐漸…

:尋找指定和的整數對_尋找時間:如何增加設計的時間

:尋找指定和的整數對Good design derives from good thinking. And good thinking is highly correlated to how much time you spend. In every place I’ve been though, every designer seems to be thirsty for more time to design. Why does this happen, to a point whe…

JavaScript命名空間namespace的實現方法

網上有很多了&#xff0c;這里給出一個&#xff0c;其實思路就是A{}; A.b{};其實b是A的一個屬性。只是做了一些封裝&#xff0c;最后的效果是可以直接定義多個namespace&#xff1a; 1: My.namespace("Company", "Company.Feed", "Company.Feed.Mess…

通過MySQL存儲原理來分析排序和鎖

先拋出幾個問題1.為什么不建議使用訂單號作為主鍵?2.為什么要在需要排序的字段上加索引?3.for update 的記錄不存在會導致鎖住全表?4.redolog 和 binlog 有什么區別?5.MySQL 如何回滾一條 sql ?6.char(50) 和 varchar(50) 效果是一樣的么?索引知識回顧對于 MySQL 數據庫而…

1600k 打印頭測試軟件,巧修LQ-1600K打印機打印頭

LQ-1600K 24針中英文打印機&#xff0c;由于其打印速度快、輸出的文字漂亮、軟件兼容性好等優點&#xff0c;在國內得到極為廣泛的應用。但該機的打印頭及打印針驅動電路故障率較高&#xff0c;一旦出現此類故障&#xff0c;打印效果將大打折扣。本人在長期維修工作中&#xff…

linkedin爬蟲_重新設計Linkedin的指導功能-用戶體驗案例研究

linkedin爬蟲為什么選擇導師 Linkedin平臺&#xff1f; (Why mentorship Linkedin platform?) As a recent graduate, I went on Linkedin to seek career advice and mentorship. This idea came so naturally that I was quite surprised by the absence of a complete fea…

POJ 1797 Heavy Transportation 解題報告

分類&#xff1a;圖論&#xff0c;生成樹&#xff0c;最短路&#xff0c;并查集作者&#xff1a;ACShiryu時間&#xff1a;2011-7-28地址&#xff1a;ACShiryus BlogHeavy TransportationTime Limit: 3000MSMemory Limit: 30000KTotal Submissions: 11929Accepted: 3171Descrip…

曾以為只能拿8K,22屆學弟字節校招心路歷程

大家好&#xff0c;我是若川。最近組織了源碼共讀活動《1個月&#xff0c;200人&#xff0c;一起讀了4周源碼》&#xff0c;已經有超50人提交了筆記&#xff0c;群里已經有超1500人&#xff0c;感興趣的可以點此鏈接掃碼加我微信 ruochuan12這篇文章記錄了江西師大學弟進入字節…

王者榮耀cpu測試軟件,你的手機能否玩王者榮耀,主流處理器新版王者榮耀測試...

說道國民級手游&#xff0c;目前來看那絕對是王者榮耀和刺激戰場&#xff0c;之前的話那可是王者榮耀的天下&#xff0c;甚至許多手機廠商在發布新手機的時候會專門公布王者榮耀的幀率&#xff0c;可見王者榮耀帶來的影響有多大。新版王者榮耀隨著王者榮耀的優化和手機系統、硬…

關于MFC遇到的一系列類型轉換問題

1.LPTSTR 轉換成 CString&#xff1a; (1)直接賦值 CString strText; LPTSTR lpszText _T("LPTSTR >> CString"); strText lpszText; ::MessageBox( NULL, strText , _T("標題"), MB_ICONASTERISK|MB_TASKMODAL|MB_OK );(2)CString::Format()格式化…

大蕭條時期什么行業走俏_大流行時期的用戶體驗

大蕭條時期什么行業走俏You’ve read a lot about uncertain times and social distancing. We’re all surrounded by the same words, but what exactly do they mean for the UX people? The nearest future is just the tip of the iceberg. The COVID-19 pandemic is lik…

vsftp虛擬用戶無法上傳文件,解決辦法

vsftp虛擬用戶無法上傳文件&#xff0c;解決辦法 1、打開/etc/vsftpd 目錄中的vsftpd.conf文件&#xff0c;查找&#xff1a;guest_usernamexxx&#xff0c;這里指的是vsftpd虛擬用戶對應的實 際系統用戶。 2、將該xxx用戶的R權限賦予想要上傳的目錄&#xff1a;chown -R xxx.x…

面試官問:來實現一個Promise

大家好&#xff0c;我是若川。最近組織了源碼共讀活動《1個月&#xff0c;200人&#xff0c;一起讀了4周源碼》&#xff0c;已經有超50人提交了筆記&#xff0c;群里已經有超1500人&#xff0c;感興趣的可以點此鏈接掃碼加我微信 ruochuan12 參與&#xff0c;一起學習&#xff…