1. 程式人生 > >選擇排序詳解

選擇排序詳解

[0 ron println nbsp [] object brush until oid

選擇排序

選擇排序是最簡單的排序方法之一,它的做法是這樣的:首先,找出數組中最小的那個元素,將最小的元素與第一個元素的位置互換,然後找出數組中第二小的元素,與數組中第二個元素互換位置(如果要比較的元素是當前最小,則自己和自己交換),以此類推,直到遍歷了整個數組。這種方法叫做選擇排序,因為它會不斷地選擇剩余元素中的最小者。

表格1-1排序步驟
初始值: 1 10 -5 9 8 7 3
第一趟: -5 10 1 9 8 7 3
第二趟: -5 1 10 9 8 7 3
第三趟: -5 1 3 9 8 7 10
第四趟: -5 1 3 7 8 9 10
第五趟: -5 1 3 7
8 9 10
第六趟: -5 1 3 7 8 9 10
第七趟: -5 1 3 7 8 9 10

如表格1-1所示,紅色代表已經排序好的序列,每次交換都能排定一個元素,因此交換的總次數是N,算法的運行時間和輸入無關,因為內循環會進行(N-1)+(N-2)+……+1=N(N-1)/2~(N2/2)次比較,因此選擇排序的時間復雜度為O(n2)

以下代碼分別為C、Java、Python、Scala

  

算法1-2為選擇排序的C語言實現

#include <stdio.h>

void selection_sort( int arr[], int len );


void selection_sort( int arr[], int len )
{
    int i = 0, j = 0, min = 0, temp = 0;
    for ( i = 0; i < len; i++ )
    {
        min = i;
        for ( j = min + 1; j < len; j++ )
        {
            if ( arr[min] > arr[j] )
            {
                min = j;
            }
        }
        temp        = arr[i];
        arr[i]        = arr[min];
        arr[min]    = temp;
    }
}


void main()
{
    int    i    = 0;
    int    arr[]    = { 1, 10, -5, 9, 8, 7, 3 };
    int    len    = sizeof(arr) / sizeof(arr[0]);
    printf( "待排序數組:" );
    for ( i = 0; i < len; i++ )
    {
        printf( "%d ", arr[i] );
    }
    printf( "\n" );
    selection_sort( arr, len );
    printf( "排序後數組:" );
    for ( i = 0; i < len; i++ )
    {
        printf( "%d ", arr[i] );
    }
}

  

算法1-3為選擇排序的Java實現

import java.util.Arrays;

public class Selection {

    public static void selectionSort(int... arr) {
        for (int i = 0; i < arr.length; i++) {
            int min = i;
            for (int j = min + 1; j < arr.length; j++) {
                if (arr[min] > arr[j]) {
                    min = j;
                }
            }
            int temp = arr[i];
            arr[i] = arr[min];
            arr[min] = temp;
        }
    }

    public static void main(String[] args) {
        int[] arr = { 1, 10, -5, 9, 8, 7, 3 };
        System.out.print("待排序數組:" + Arrays.toString(arr));
        System.out.println();
        selectionSort(arr);
        System.out.println("排序後數組:" + Arrays.toString(arr));
    }

}

  

算法1-4為選擇排序的Python實現

# coding:utf-8
def selection_sort(arr):
    for i in range(0, len(arr)):
        min = i
        for j in range(min + 1, len(arr)):
            if arr[min] > arr[j]: min = j
        temp = arr[i]
        arr[i] = arr[min]
        arr[min] = temp


arr = [1, 10, -5, 9, 8, 7, 3]
print "待排序數組:", arr
selection_sort(arr)
print "排序後數組", arr

  

算法1-5為選擇排序的Scala實現

import java.util.Arrays

object Selection {

  def selectionSort(comparator: (Int, Int) => Boolean)(arr: Array[Int]) {
    for (i <- 0 until arr.length) {
      var min = i
      for (j <- min + 1 until arr.length) {
        if (comparator(arr(min), arr(j))) {
          min = j
        }
      }
      var temp = arr(i)
      arr(i) = arr(min)
      arr(min) = temp
    }
  }

  def main(args: Array[String]): Unit = {
    val arr = Array(1, 10, -5, 9, 8, 7, 3)
    println("待排序數組:" + Arrays.toString(arr))
    selectionSort(_ > _)(arr)
    println("排序後數組:" + Arrays.toString(arr))

  }

}

選擇排序詳解