那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

排序算法之選擇排序

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-09-25 16:30 ? 次閱讀

選擇排序: (Selection sort)是一種簡單直觀的排序算法,也是一種不穩定的排序方法。

選擇排序的原理:

一組無序待排數組,做升序排序,我們先假定第一個位置上的數據就是最小的,我們用一個參數記錄這個最小的數,然后依次把后面的每個位置的數據和這個最小的比較,如果比這個數小就替換兩個位置數據,等到第一輪比較完成就能確定最小的數據排在第一位了,然后第二輪從第二個位置開始,相同的方式比較,每次都能找到本輪最小的值,直至全部待排元素個數為0的時候,數組就排好順序了。

選擇排序流程圖

圖片

我們來進行詳細解析看看

首先我們給個無序數組[4,6,15,9,12,3,32]進行升序排序,因為需要確定每個數組的長度,所以需要比較數組長度-1輪,當前面的元素都排好了之后,那么數組最后一個元素自然就確定了位置。

我們定義兩個值,minIndex,minNum用來分別表示每一輪的找到的最小值的下標和值,后面未排序的值都和minNum比較,從而找出每一輪的最小值。

  • 第一輪我們以下標為1的第一位作為標志位(也就是把第一個值當做最小值),那么此時minIndex=0,minNum=4,經過和 minNum 比較發現后面只有3比4小,那么3和4交換位置,minIndex=5,minNum=3,把4換到下標為5的位置,如下圖所示:

圖片第一輪我們得到的結果是[3,6,15,9,12,4,32],本輪最小數是:3,所以3放到本輪標志位,也就是第一位

  • 第二輪:拿到第一輪排序的值作為初始值[3,6,15,9,12,4,32],同第一輪一樣,此時6作為標志位minNum=6,minNum和其他比較,只有4比6小,需要交換位置,如下圖所示圖片第二輪排序結果[3,4,15,9,12,6,32],本輪最小數是:4
  • 第三輪:初始值[3,4,15,9,12,6,32],這次標志位15,minNum=15,minIndex=2,minNum先比和9比較,發現9比15小,minNum=9,minIndex=3,然后minNum和12比較,不需要替換minNum,再和6比較,minNum=6,minIndex=5,后面再比較已經沒有比6小了,那么本輪就是初始標志位15和下標為5,值為6的數據換位置。圖片
    第三輪排序結果[3,4,6,9,12,15,32],本輪最小數是:6
  • 第四、五、六輪:初始值[3,4,6,9,12,15,32],經過前面的比較我們可以看到數組已經排序完成,但是程序并不知道,會繼續比較下去,把下標為4、5、6位置都作為標志位比較一次,發現都不需要變動位置,那么最終執行完成之后就能排序完成圖片第四、五、六輪排序結果[3,4,6,9,12,15,32]

到這,我們已經清楚了每個步驟做了什么,那么接下來上代碼驗證一下:

Java代碼實現

public class selectionSort {
     public static void main(String[] args){
          int[] arr = new int[]{4,6,15,9,12,3,32};
         for(int i=0;i< arr.length-1;i++){//每次循環都會找出最小的數
             //記錄最小數的下標
             int minIndex = i;
             //記錄最小數
             int minNum = arr[i];
             //每次循環都會找出最小的數
             for(int j=i+1;j< arr.length;j++){
                 if(arr[j]< minNum){//如果當前數比最小數小,則更新最小數
                     minNum = arr[j];//更新最小數
                     minIndex = j;//更新最小數的下標
                 }
             }
             //將最開始假定的小的數移動到真實最小的位置
             arr[minIndex]=arr[i];
             arr[i]=minNum;//將標志位放到最小數原來所在的位置
             
             //打印結果,方便查看
             System.out.print("第"+(i+1)+"輪[");
             for(int a=0;a< arr.length;a++){
                 System.out.print(arr[a]+"t");
             }
             System.out.println ("],本輪最小數是:"+minNum);
         }
         System.out.print("最終結果[");
         for(int i=0;i< arr.length;i++){
             System.out.print(arr[i]+"t");
         }
         System.out.println("]");
     }
 }

輸出結果

1[3 6 15 9 12 4 32 ],本輪最小數是:32[3 4 15 9 12 6 32 ],本輪最小數是:43[3 4 6 9 12 15 32 ],本輪最小數是:64[3 4 6 9 12 15 32 ],本輪最小數是:95[3 4 6 9 12 15 32 ],本輪最小數是:126[3 4 6 9 12 15 32 ],本輪最小數是:15
  最終結果[3 4 6 9 12 15 32 ]

時間復雜度

我們通過上面的細節拆分發現,無論是否是已經排好的還是沒排好的情況,我們都需要每個數字都比較到,那么就出現N個元素的數組,第一輪是n次比較,第二輪是從第二個位置開始,那么就是n-1,第三輪就是n-2次... 最后是1,那么就出現了n+(n-1)+(n-2)+(n-3)...1,這是一個等差數列,求和為一個二次型多項式,因為等差數列求和會出現二次型;我們取最高階就是n^2,所以時間復雜度就是O(n^2),而且最好和最壞的情況時間復雜度都是O(n^2)

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7139

    瀏覽量

    89576
  • JAVA
    +關注

    關注

    19

    文章

    2974

    瀏覽量

    105139
  • 代碼
    +關注

    關注

    30

    文章

    4825

    瀏覽量

    69044
  • 排序算法
    +關注

    關注

    0

    文章

    53

    瀏覽量

    10102
  • 數組
    +關注

    關注

    1

    文章

    417

    瀏覽量

    26028
收藏 人收藏

    評論

    相關推薦

    FPGA排序-冒泡排序介紹

    排序算法是圖像處理中經常使用一種算法,常見的排序算法有插入排序、希爾
    發表于 07-17 10:12 ?1149次閱讀
    FPGA<b class='flag-5'>排序</b>-冒泡<b class='flag-5'>排序</b>介紹

    十大排序算法總結

    排序算法是最經典的算法知識。因為其實現代碼短,應該廣,在面試中經常會問到排序算法及其相關的問題。一般在面試中最常考的是快速
    的頭像 發表于 12-20 10:39 ?1168次閱讀

    嵌入式stm32實用的排序算法 - 交換排序

    合很多,我這里就不再一一舉例說明,掌握排序的基本算法,到時候遇到就有用武之地。Ⅱ、排序算法分類1.按存儲分類:內部排序和外部
    發表于 04-12 13:14

    C語言冒泡、插入法、選擇排序算法分析

    C語言冒泡、插入法、選擇排序算法分析
    發表于 09-06 15:51 ?44次下載

    C語言教程之幾種排序算法

    數據結構的排序算法有很多種。 其中, 快速排序 、希爾排序、堆排序、直接選擇
    發表于 11-16 10:23 ?1780次閱讀

    c語言排序算法選擇排序

    應廣大"鳥友"強烈要求,小編將會推出《排序系列》,給大家講講排序那些事。? ? ? ? ?那么今天首先給大家講解最符合人類思維邏輯的超簡單排序法?《選擇
    發表于 11-16 10:25 ?3455次閱讀
    c語言<b class='flag-5'>排序</b><b class='flag-5'>算法</b><b class='flag-5'>之</b><b class='flag-5'>選擇</b><b class='flag-5'>排序</b>法

    常用的排序算法總覽

    我們通常所說的排序算法往往指的是內部排序算法,即數據記錄在內存中進行排序
    的頭像 發表于 06-13 18:18 ?2886次閱讀
    常用的<b class='flag-5'>排序</b><b class='flag-5'>算法</b>總覽

    常用的非比較排序算法:計數排序,基數排序,桶排序的詳細資料概述

    這篇文章中我們來探討一下常用的非比較排序算法:計數排序,基數排序,桶排序。在一定條件下,它們的時間復雜度可以達到O(n)。
    的頭像 發表于 06-18 15:11 ?7210次閱讀
    常用的非比較<b class='flag-5'>排序</b><b class='flag-5'>算法</b>:計數<b class='flag-5'>排序</b>,基數<b class='flag-5'>排序</b>,桶<b class='flag-5'>排序</b>的詳細資料概述

    常用排序算法分析

    一種是比較排序,時間復雜度O(nlogn) ~ O(n^2),主要有:冒泡排序選擇排序,插入排序,歸并
    的頭像 發表于 07-13 16:13 ?2203次閱讀

    C語言中的排序算法了解

    選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到
    的頭像 發表于 11-12 14:52 ?2688次閱讀

    實用的排序算法 - 交換排序

    實用的排序算法 - 交換排序
    的頭像 發表于 03-20 09:53 ?1781次閱讀
    實用的<b class='flag-5'>排序</b><b class='flag-5'>算法</b> -  交換<b class='flag-5'>排序</b>

    詳談選擇排序算法的定義和過程

    選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理是:第一次從待排序的數據元素中選出最小(或最大)的一個元素,存
    的頭像 發表于 06-30 17:06 ?3583次閱讀
    詳談<b class='flag-5'>選擇</b><b class='flag-5'>排序</b><b class='flag-5'>算法</b>的定義和過程

    排序算法分享:歸并排序說明

    我們今天繼續給大家分享排序算法里面的另外一種排序算法:歸并排序
    的頭像 發表于 12-24 14:34 ?801次閱讀

    淺談希爾排序算法思想以及如何實現

    算法進行排序,隨著增量減少,每組包含的關鍵字越來越多,增量減到1時,整個序列被分為一組,算法終止。 我們以增序排序為例,希爾排序基本步驟:
    的頭像 發表于 06-30 10:05 ?2066次閱讀

    常見排序算法分類

    本文將通過動態演示+代碼的形式系統地總結十大經典排序算法排序算法 算法分類 —— 十種常見排序
    的頭像 發表于 06-22 14:49 ?971次閱讀
    常見<b class='flag-5'>排序</b><b class='flag-5'>算法</b>分類
    百家乐官网娱乐网佣金| 大发888娱乐新澳博| 百家乐官网翻天粤qvod| 百家乐国际娱乐场| 百家乐官网高手投注法| 玩百家乐输了| 至尊百家乐官网20111110| 杭州百家乐西园| 最好的百家乐官网博彩网站| 大发888博彩娱乐城| 博E百百家乐官网的玩法技巧和规则| 百家乐打法介绍| 百家乐官网之三姐妹赌博机| 太阳城娱乐正网| 万龙百家乐官网的玩法技巧和规则| 大发888 制度| 百家乐全程打庄| 百家乐官网de概率| 世嘉百家乐的玩法技巧和规则| 百家乐官网庄闲点| 大发扑克娱乐网| 百家乐赌博游戏| 百家乐官网免费试玩游戏| 东京太阳城王子大酒店| 游艇会百家乐官网的玩法技巧和规则 | 威斯汀百家乐官网的玩法技巧和规则| 皇冠娱乐| 百家乐注码技术打法| 百家乐官网tt娱乐城娱乐城| 大发888娱乐场ylc8| 真人百家乐试玩账号| 诚信百家乐官网在线平台| 德州扑克术语| 极速百家乐真人视讯| 粤港澳百家乐官网娱乐平台| k7线上娱乐| 百苑百家乐的玩法技巧和规则 | 娱网棋牌官方网站| 百家乐玩揽法的论坛| 百家乐官网挂机软件| 万博88真人娱乐城|