最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java數(shù)據(jù)結(jié)構(gòu)之選擇排序算法的實現(xiàn)與優(yōu)化

 更新時間:2023年01月21日 09:55:14   作者:從未止步..  
選擇排序:(Selection?sort)是一種簡單直觀的排序算法,也是一種不穩(wěn)定的排序方法。本文主要為大家介紹一下選擇排序的實現(xiàn)與優(yōu)化,希望對大家有所幫助

初識選擇排序

算法思想[以升序為例]:

第一趟選擇排序時,從第一個記錄開始,通過n-1次關(guān)鍵字的比較,從第n個記錄中選出關(guān)鍵字最小的記錄,并和第一個記錄進行交換

第二趟選擇排序時,從第二個記錄開始,通過n-2次關(guān)鍵字的比較,從第n-1個記錄中選出關(guān)鍵字最小的記錄,并和第二個記錄進行交換

第i趟選擇排序時,從第i個記錄開始,通過n-i次關(guān)鍵字的比較,從n-i+1個記錄中選擇出關(guān)鍵字最小的記錄,并和第i個記錄進行交換

反復進行上述步驟,經(jīng)過n-1趟選擇排序,將把n-1個記錄排到位,最后剩下的那個元素同樣已經(jīng)就位,所以共需進行n-1趟選擇排序

文字描述[以升序為例]

將數(shù)組分為兩個子集,排序的和未排序的,每一輪從未排序的子集中選出最小的元素,放入排序子集,重復上述步驟,直至整個數(shù)組有序

算法實現(xiàn)

代碼如下:

package bin_find;
import java.util.Arrays;

public class selectionSort {
    public static void main(String[] args) {
        int[] a={5,3,7,2,1,9,8,4};
        selection(a);
    }

    private static void selection(int[] a){
        for(int i=0;i<a.length-1;i++) {//n個元素參與排序,需要進行n-1次
            for (int j = i + 1; j < a.length; j++) {//每輪i+1---a.length個元素之間相比較
                if (a[i] > a[j]) {//前者大于后者,則進行交換
                    swap(a, i, j);
                }
            }
            System.out.println("第"+(i+1)+"輪選擇排序的結(jié)果"+Arrays.toString(a));
        }
    }
    public static void swap(int arr[],int i,int j){
        int t=arr[i];
        arr[i]=arr[j];
        arr[j]=t;
    }
}

輸出如下:

第1輪選擇排序的結(jié)果[1, 5, 7, 3, 2, 9, 8, 4]
第2輪選擇排序的結(jié)果[1, 2, 7, 5, 3, 9, 8, 4]
第3輪選擇排序的結(jié)果[1, 2, 3, 7, 5, 9, 8, 4]
第4輪選擇排序的結(jié)果[1, 2, 3, 4, 7, 9, 8, 5]
第5輪選擇排序的結(jié)果[1, 2, 3, 4, 5, 9, 8, 7]
第6輪選擇排序的結(jié)果[1, 2, 3, 4, 5, 7, 9, 8]
第7輪選擇排序的結(jié)果[1, 2, 3, 4, 5, 7, 8, 9]

優(yōu)化后的算法實現(xiàn)

優(yōu)化思路

減少交換次數(shù),每一輪可以先找到最小的索引,再每輪最后再交換元素

代碼如下:

package bin_find;
import java.util.Arrays;

public class selectionSort {
    public static void main(String[] args) {
        int[] a={5,3,7,2,1,9,8,4};
        selection(a);
    }

    private static void selection(int[] a){
        //代表每輪選擇最小元素要交換到的目標索引
        for(int i=0;i<a.length-1;i++) {

            int s = i;//代表最小元素的索引[這里是升序]---第一次最小元素的索引為1,第二次最小元素的索引為2.....

            //從當前最小元素的下一位元素開始直到最后一個元素---完成一次選擇排序
            for (int j = s + 1; j < a.length; j++) {
                //[這里是升序],前者大于后者,則將更小數(shù)的索引值賦值給s,因為變量s本身代表的含義為最小元素的索引
                if (a[s] > a[j]) {
                    s = j;
                }
            }
            if (s != i) {//若不是同一個數(shù),則進行交換
                swap(a, s, i);
            }
            System.out.println("第"+(i+1)+"輪選擇排序的結(jié)果"+Arrays.toString(a));
        }
    }
    public static void swap(int arr[],int i,int j){
        int t=arr[i];
        arr[i]=arr[j];
        arr[j]=t;
    }
}

輸出:

第1輪選擇排序的結(jié)果[1, 3, 7, 2, 5, 9, 8, 4]
第2輪選擇排序的結(jié)果[1, 2, 7, 3, 5, 9, 8, 4]
第3輪選擇排序的結(jié)果[1, 2, 3, 7, 5, 9, 8, 4]
第4輪選擇排序的結(jié)果[1, 2, 3, 4, 5, 9, 8, 7]
第5輪選擇排序的結(jié)果[1, 2, 3, 4, 5, 9, 8, 7]
第6輪選擇排序的結(jié)果[1, 2, 3, 4, 5, 7, 8, 9]
第7輪選擇排序的結(jié)果[1, 2, 3, 4, 5, 7, 8, 9]

未進行優(yōu)化的算法輸出:

進行優(yōu)化的算法輸出:

通過比較二者的輸出結(jié)果,我們能夠很明顯的感覺到,經(jīng)過優(yōu)化后的算法在實現(xiàn)的過程中,數(shù)據(jù)之間的交換次數(shù)明顯減少

選擇排序 VS 冒泡排序

1:二者的平均復雜度都是O(n^2),但是當有序數(shù)組使用冒泡排序時,其時間復雜度為O(n)

2:選擇排序一般要快于冒泡排序,因為其交換的次數(shù)少

3:但如果集合有序度高,那么冒泡排序優(yōu)先于選擇排序

例:在上篇文章的冒泡排序優(yōu)化算法中,我們通過設(shè)置變量,去判斷當前的數(shù)組元素是否發(fā)生交換,如果未發(fā)生交換,則證明當前數(shù)組已經(jīng)有序,不再進行排序

4:冒泡排序?qū)儆诜€(wěn)定排序算法,而選擇屬于不穩(wěn)定排序

穩(wěn)定 VS 不穩(wěn)定:即為兩個大小相等的數(shù),在參與排序之前具有先后關(guān)系,若排序完成,這兩個數(shù)的先后順序并未發(fā)生改變,那么即為穩(wěn)定排序,否則為不穩(wěn)定排序

舉例:

(3,3,2)

對于上述數(shù)組:

參與冒泡排序:

第一輪:3和3相等,無需交換位置,3和2交換位置

第二輪:3和2交換位置

排序結(jié)束,排序后的結(jié)果為(2,3,3)

參與選擇排序:

第一輪:將3取出,與3比較,3不滿足大于3,再與2進行比較,滿足大于2,交換位置

第二輪:將3取出,與3進行比較,不滿足大于3

排序結(jié)束,排序成功,排序后的結(jié)果為(2,3,3)

通過兩種方法的排序結(jié)果,我們不難看出通過冒泡排序算法,兩個大小相等的數(shù)的先后關(guān)系并沒有發(fā)生改變,即為穩(wěn)定的排序,而通過選擇排序算法,兩個大小相等的數(shù)的先后關(guān)系發(fā)生了改變,即為不穩(wěn)定的排序

到此這篇關(guān)于Java數(shù)據(jù)結(jié)構(gòu)之選擇排序算法的實現(xiàn)與優(yōu)化的文章就介紹到這了,更多相關(guān)Java選擇排序算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java控制臺實現(xiàn)學生信息管理系統(tǒng)

    java控制臺實現(xiàn)學生信息管理系統(tǒng)

    這篇文章主要為大家詳細介紹了java控制臺實現(xiàn)學生信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • springboot+RabbitMQ+InfluxDB+Grafara監(jiān)控實踐

    springboot+RabbitMQ+InfluxDB+Grafara監(jiān)控實踐

    這篇文章主要介紹了springboot+RabbitMQ+InfluxDB+Grafara監(jiān)控實踐,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • 詳解Spring DI依賴注入的方式和類型

    詳解Spring DI依賴注入的方式和類型

    這篇文章主要介紹了詳解Spring DI依賴注入的方式和類型,DI是由容器動態(tài)的將某個依賴關(guān)系注入到組件之中。依賴注入的目的并非為軟件系統(tǒng)帶來更多功能,而是為了提升組件重用的頻率,并為系統(tǒng)搭建一個靈活、可擴展的平臺,需要的朋友可以參考下
    2023-05-05
  • 詳解Java 類的加載、連接和初始化

    詳解Java 類的加載、連接和初始化

    這篇文章主要介紹了Java 類的加載、連接和初始化的的相關(guān)資料,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-06-06
  • 利用Java實現(xiàn)mTLS調(diào)用

    利用Java實現(xiàn)mTLS調(diào)用

    這篇文章主要介紹使用 Java作為客戶端 與受 mTLS 保護的服務交互。為了對我們的 Java 客戶端進行 ssl 配置,我們需要先設(shè)置一個 SSLContext。這簡化了事情,因為 SSLContext 可用于各種 http 客戶端,接下來我們一起進入下面文章了解具體內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • RocketMQ發(fā)送事務消息詳解

    RocketMQ發(fā)送事務消息詳解

    這篇文章主要介紹了RocketMQ發(fā)送事務消息詳解,RocketMQ分布式事務消息不僅可以實現(xiàn)應用之間的解耦,又能保證數(shù)據(jù)的最終一致性,傳統(tǒng)的大事務可以被拆分為小事務,不僅能提升效率,還不會因為某一個關(guān)聯(lián)應用的不可用導致整體回滾,需要的朋友可以參考下
    2023-09-09
  • jdk8的datetime時間函數(shù)使用示例

    jdk8的datetime時間函數(shù)使用示例

    這篇文章主要介紹了jdk8的datetime時間函數(shù)使用示例,需要的朋友可以參考下
    2014-03-03
  • Springboot實現(xiàn)多數(shù)據(jù)源切換詳情

    Springboot實現(xiàn)多數(shù)據(jù)源切換詳情

    這篇文章主要介紹了Springboot實現(xiàn)多數(shù)據(jù)源切換詳情,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的朋友可以參考一下
    2022-09-09
  • Java 日期與時間API相關(guān)用法總結(jié)

    Java 日期與時間API相關(guān)用法總結(jié)

    這篇文章主要介紹了Java 日期與時間API相關(guān)用法總結(jié),幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-02-02
  • Java8中對泛型目標類型推斷方法的改進

    Java8中對泛型目標類型推斷方法的改進

    這篇文章主要介紹了Java8中對泛型目標類型推斷方法的改進,需要的朋友可以參考下
    2014-06-06

最新評論

忻州市| 漳州市| 丰宁| 汉川市| 潍坊市| 宁阳县| 杭锦旗| 东兰县| 名山县| 夏津县| 寿光市| 桂平市| 玛曲县| 大冶市| 镇江市| 龙口市| 皮山县| 庆城县| 铜梁县| 三台县| 唐河县| 田林县| 墨玉县| 新营市| 砀山县| 富蕴县| 湘潭县| 嘉义县| 岫岩| 封丘县| 樟树市| 江西省| 唐海县| 鹿泉市| 花莲县| 修水县| 萨嘎县| 洪雅县| 宜兰市| 和田县| 乐陵市|