1. 程式人生 > >算法大神之路----排序(選擇排序法)

算法大神之路----排序(選擇排序法)

system 一個數 數組 public 由於 空間復雜度 結果 代碼 選擇

選擇排序法,顧名思義,就是把特定的數據選擇出來進行排序.

選擇排序法有兩種方式

  • 在所有的數據中,當由大到小排序,那麽就將最大值放到第一個位置
  • 如果由小到大排序,那麽就將最小值放到第一個位置

以由小到大排序舉例,當排序時候,掃描整個數據,拿第一個依次與其他做比較,如果其他數據比第一個大,或者相等,那麽就不交換,如果其他數據比第一個數小,那麽就交換二者的位置,掃描結束後,則從第二個數開始,依次掃描.

方法分析

  • 無論是最壞還是最好情況,甚至是平均情況下,都需要對全部數據進行掃描,找到最大或最小值,因此,次數為n(n-1)/2次,時間復雜度為O(n2).
  • 由於選擇排序是以最大或者最小值直接與未排序的數據進行比較以及交換,數據排列很有可能被改變,故選擇排序法不是一個穩定的排序法
  • 空間復雜度最佳,只需要一個額外的空間

綜合以上的情況,選擇排序法,適用於數據量小,或者有部分數據以及排過序的情況.

代碼示例(由小到大排序)

import java.util.Random;

/**
 * 算法大神之路----排序(選擇排序法)
 */
public class Study02 {

    public static void main(String[] args) {

        //新建一個數組
        int[] arr = new int[6];
        Random r = new Random();
        for (int i = 0; i < arr.length; i++) {
        
//使用隨機數給數組賦值 arr[i] = r.nextInt(50); } System.out.print("原數組為:"); paint(arr); System.out.println("-----排序-----"); //選擇排序法對數據進行排序 for (int i = 0; i <arr.length; i++) { System.out.print("第"+(i+1)+"次掃描"); for (int j = i+1; j < arr.length; j++) {
if (arr[j]>=arr[i]) { //拿最前端數據依次同其他數據比較,當其他數據比最前端大的時候,那麽不變 }else{ //當其他數據比第一個數據小的時候.交換位置 int temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } } paint(arr); } } //將數組數據打印至控制臺 public static void paint(int[] arr){ for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]+"\t"); } System.out.println(); } }

控制臺打印結果:

原數組為:29    15    2    3    37    39    
-----排序-----
第1次掃描2    29    15    3    37    39    
第2次掃描2    3    29    15    37    39    
第3次掃描2    3    15    29    37    39    
第4次掃描2    3    15    29    37    39    
第5次掃描2    3    15    29    37    39    
第6次掃描2    3    15    29    37    39

總結:選擇排序法不管是否中途已經排完畢,都需要經過固定次的掃描,相對於冒泡排序法,掃描次數不能減少.

算法大神之路----排序(選擇排序法)