1. 程式人生 > >java實現幾種常用排序:選擇排序

java實現幾種常用排序:選擇排序

一.選擇排序介紹

選擇排序,顧名思義就是用逐個選擇的方式來進行排序,逐個選擇出陣列中的最大(或最小)的元素,直到選擇至最後一個元素。此時陣列完成了排序。

二.選擇排序原理分析

三.選擇排序程式碼實現

/**
 * @Author {LearnAndGet}
 * @Time 2019年1月8日
 * @Discription:選擇排序
 */
package com.sort;

import java.util.Arrays;

public class ChooseSort {

    static int[] array = {3,2,4,1,5,0};
    
    public static void chooseSort(int[] a) 
    {
        int max = 0;
        int index = 0;
        //外層迴圈,控制選擇的次數,陣列長度為6,一共需要選擇5次
        for(int i=0;i<a.length-1;i++) 
        {
            for(int j=0;j<a.length-i;j++) 
            {
                if(max < a[j]) 
                {
                    max = a[j];
                    index = j;
                }
            }
            //每次選擇完成後,max中存放的是該輪選出的最大值
            //將max指向位置的元素和陣列最後一個元素位置互換
            int temp = a[a.length-i-1];
            a[a.length-i-1] = max;
            a[index] = temp;
            //清空max和index,便於下次
            max=0;
            index =0;
            System.out.println("經過第"+(i+1)+"輪選擇後,陣列為"+Arrays.toString(a));
        }
    }
    
    public static void main(String[] args) {
        chooseSort(array);
    }
}

四選擇排序程式碼優化

因為選擇排序過程中,每一輪選擇出最大的元素並將它和陣列最後一位互換位置,那麼即使在某一輪的選擇過程中,未發生位置互換,此時也不能說明陣列已經排序完成,假設陣列: 2 1 3 4 5 進行升序排列

  1. 第一輪選擇後,陣列序列為:2 1 3 4 5

  2. 第二輪選擇後,陣列序列為:2 1 3 4 5

  3. 第三輪選擇後,陣列序列為:2 1 3 4 5

  4. 第四輪選擇後,陣列序列為:1 2 3 4 5

    可以看到,即使前三輪的選擇過程中,都沒有發生陣列元素互換,但是此時陣列仍未排序完成,直到第4輪選擇完成後,陣列才完成了排序。因此選擇排序並不能優化。

五.選擇排序時間複雜度

計算時間複雜度時,預設計算最複雜的情況下需要進行的次數:比如將陣列:5 4 2 1 3進行升序排列:

  1. 第一輪選擇排序:一共需要進行4次比較。可以將5和3互換,得到:3 4 2 1 5
  2. 第二輪選擇排序:一共需要進行3次比較。可以將4和1互換,得到:3 1 2 4 5
  3. 第三輪選擇排序:一共需要進行2次比較。可以將3和2互換,得到:2 1 3 4 5
  4. 第四輪選擇排序:一共需要進行1次比較。可以將2和1互換,得到:1 2 3 4 5

可以看到,對陣列長度為5進行排序,需要進行比較的次數為4+3+2+1=10次。若陣列長度為n,那麼進行比較的次數為(n-1)+(n-2)+(n-3)+...1 = n * (n - 1) / 2,當n足夠大時,n * (n - 1) / 2約等於n*n。

綜上所述,選擇排序的時間複雜度為:O(n²)