成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

數(shù)據(jù)結(jié)構(gòu)與算法(三):帶你讀懂選擇排序(Selection sort)

Kaede / 3433人閱讀

摘要:基本介紹選擇式排序也屬于內(nèi)部排序法,是從欲排序的數(shù)據(jù)中,按指定的規(guī)則選出某一元素,再依規(guī)定交換位置后達(dá)到排序的目的。而移動(dòng)次數(shù)與序列的初始排序有關(guān)??臻g復(fù)雜度簡(jiǎn)單選擇排序需要占用個(gè)臨時(shí)空間,在交換數(shù)值時(shí)使用。

1. 基本介紹

選擇式排序(select sorting)也屬于內(nèi)部排序法,是從欲排序的數(shù)據(jù)中,按指定的規(guī)則選出某一元素,再依規(guī)定交換位置后達(dá)到排序的目的。

2. 選擇排序思想

基本思想是:第一次從 arr[0]~arr[n-1]中選取最小值,與 arr[0]交換,第二次從 arr[1]~arr[n-1]中選取最小值,與 arr[1]交換,第三次從 arr[2]~arr[n-1]中選取最小值,與 arr[2]交換,…,第 i 次從 arr[i-1]~arr[n-1]中選取最小值,與 arr[i-1]交換,…, 第 n-1 次從 arr[n-2]~arr[n-1]中選取最小值,與 arr[n-2]交換,總共通過(guò) n-1 次,得到一個(gè)按排序碼從小到大排列的有序序列。

3. 選擇排序理解

3.1 選擇排序圖解


1.選擇排序一共有數(shù)組大小-1 次排序
2.每一次排序,又是一個(gè)循環(huán),循環(huán)規(guī)則如下
2.1 先假定當(dāng)前這個(gè)數(shù)是最小數(shù)
2.2 然后和后面的每個(gè)數(shù)進(jìn)行比較,如果發(fā)現(xiàn)有比當(dāng)前數(shù)更小的數(shù),就重新確定最小數(shù),并得到下標(biāo)
2.3 當(dāng)遍歷到數(shù)組的最后時(shí),就得到本輪最小數(shù)和小標(biāo)
2.4 交換代碼,再繼續(xù)

4. 選擇排序代碼
/**
 * @author: Coder編程
 * @create: 2019-6-20 22:06
 * @description: 選擇排序
 **/
public class SelectionSort {

    /**
     * 選擇排序
     * @param arr 待排序數(shù)組
     */
    public void selectionSort(Integer[] arr) {
        // 需要遍歷獲得最小值的次數(shù)
        // 要注意一點(diǎn),當(dāng)要排序 N 個(gè)數(shù),已經(jīng)經(jīng)過(guò) N-1 次遍歷后,已經(jīng)是有序數(shù)列
        for (int i = 0; i < arr.length - 1; i++) {

            int minindex = i; // 用來(lái)保存最小值得索引
            int min = arr[i]; // 用來(lái)保存最小值

            for (int j = i + 1; j < arr.length; j++) {
                if (min > arr[j]) {// 說(shuō)明假定的最小值,并不是最小
                    min = arr[j]; // 重置 min
                    minindex = j; // 重置 minIndex
                }
            }
 
            // 如果假定最小值的索引發(fā)生了改變,則進(jìn)行交換
            if(minindex != i){
                arr[minindex] = arr[i]; //此時(shí)minindex為j,因此i與j交換
                arr[i] = min;  //最小值給下標(biāo)i
            }
            System.out.format("
第 %d 趟:	", i + 1);
            Arrays.asList(arr).stream().forEach(x -> System.out.print(x + " "));
        }
    }


    public static void main(String[] args) {
        //初始數(shù)組
        Integer arrays[] = {2,9,7,5,3};
 
        // 調(diào)用選擇排序方法
        SelectionSort selection = new SelectionSort();
        System.out.print("歡迎個(gè)人公眾號(hào)Coder編程:選擇排序前:	");
        Arrays.asList(arrays).stream().forEach(x -> System.out.print(x + " "));
        selection.selectionSort(arrays);
        System.out.print("
歡迎個(gè)人公眾號(hào)Coder編程:選擇排序后:	");
        Arrays.asList(arrays).stream().forEach(x -> System.out.print(x + " "));
    }
 
}

打印結(jié)果

如果還有什么不理解的,可以把代碼Debug拋一遍就明白了。

5. 選擇排序性能分析 5.1 時(shí)間復(fù)雜度

簡(jiǎn)單選擇排序的比較次數(shù)與序列的初始排序無(wú)關(guān)。 假設(shè)待排序的序列有n個(gè)元素,則比較次數(shù)總是n(n - 1) / 2。
而移動(dòng)次數(shù)與序列的初始排序有關(guān)。當(dāng)序列正序時(shí),移動(dòng)次數(shù)最少,為 0.
當(dāng)序列反序時(shí),移動(dòng)次數(shù)最多,為3n (n- 1) / 2。
所以,綜合以上,簡(jiǎn)單排序的時(shí)間復(fù)雜度為 O(n^2)。

5.2 空間復(fù)雜度

簡(jiǎn)單選擇排序需要占用 1 個(gè)臨時(shí)空間,在交換數(shù)值時(shí)使用。

6. 選擇排序擴(kuò)展閱讀 6.1 C語(yǔ)言版
#include 
int main()
{
    int i,j,t,a[11];    //定義變量及數(shù)組為基本整型
    printf("請(qǐng)輸入10個(gè)數(shù):
");
    for(i=1;i<11;i++)
        scanf("%d",&a[i]);    //從鍵盤中輸入要排序的10個(gè)數(shù)字
    for(i=1;i<=9;i++)
        for (j=i+1;j<=10;j++)
            if(a[i]>a[j])    //如果前一個(gè)數(shù)比后一個(gè)數(shù)大,則利用中間變量t實(shí)現(xiàn)兩值互換
            {
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
    printf("排序后的順序是:
");
    for(i=1;i<=10;i++)
        printf("%5d", a[i]);    //輸出排序后的數(shù)組
    printf("
");
    return 0;
}
6.2 Python版
def selectedSort(myList):
    length = len(myList)
    for i in range(0,length-1):
        smallest = i
        for j in range(i+1,length):

            if myList[j]
6.3 JS版
var example=[2,9,7,5,3];
function selectSort(arr){
    var len=arr.length;
    var minIndex,temp;
    console.time("選擇排序耗時(shí)");
    for(i=0;i
文末
歡迎關(guān)注個(gè)人微信公眾號(hào):Coder編程
獲取最新原創(chuàng)技術(shù)文章和免費(fèi)學(xué)習(xí)資料,更有大量精品思維導(dǎo)圖、面試資料、PMP備考資料等你來(lái)領(lǐng),方便你隨時(shí)隨地學(xué)習(xí)技術(shù)知識(shí)!
新建了一下qq群:315211365,歡迎大家進(jìn)群交流一起學(xué)習(xí)。謝謝了!也可以介紹給身邊有需要的朋友。
文章收錄至
Github: https://github.com/CoderMerli...
Gitee: https://gitee.com/573059382/c...


參考文章:

https://blog.csdn.net/qq_3624...

https://www.cnblogs.com/shen-...

推薦文章:

帶你了解時(shí)間復(fù)雜度和空間復(fù)雜度到底是什么?

帶你讀懂冒泡排序(Bubble Sorting)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/75006.html

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)算法(二):帶你讀懂冒泡排序(Bubble Sorting)

    摘要:經(jīng)過(guò)一次冒泡排序,最終在無(wú)序表中找到一個(gè)最大值,第一次冒泡結(jié)束。也是我們后面要說(shuō)的冒泡排序的優(yōu)化。冒泡排序只執(zhí)行第一層循環(huán),而不會(huì)執(zhí)行第二層循環(huán)。因此冒泡排序的時(shí)間復(fù)雜度是。 showImg(https://user-gold-cdn.xitu.io/2019/6/19/16b6f986df6880f9?w=640&h=142&f=gif&s=17175);showImg(https:...

    chuyao 評(píng)論0 收藏0
  • 少啰嗦!一分鐘帶你讀懂Java的NIO和經(jīng)典IO的區(qū)別

    摘要:的選擇器允許單個(gè)線程監(jiān)視多個(gè)輸入通道。一旦執(zhí)行的線程已經(jīng)超過(guò)讀取代碼中的某個(gè)數(shù)據(jù)片段,該線程就不會(huì)在數(shù)據(jù)中向后移動(dòng)通常不會(huì)。 1、引言 很多初涉網(wǎng)絡(luò)編程的程序員,在研究Java NIO(即異步IO)和經(jīng)典IO(也就是常說(shuō)的阻塞式IO)的API時(shí),很快就會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題:我什么時(shí)候應(yīng)該使用經(jīng)典IO,什么時(shí)候應(yīng)該使用NIO? 在本文中,將嘗試用簡(jiǎn)明扼要的文字,闡明Java NIO和經(jīng)典IO之...

    Meils 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<