選擇排序詳解
阿新 • • 發佈:2017-05-29
[0 ron println nbsp [] object brush until oid
選擇排序
選擇排序是最簡單的排序方法之一,它的做法是這樣的:首先,找出數組中最小的那個元素,將最小的元素與第一個元素的位置互換,然後找出數組中第二小的元素,與數組中第二個元素互換位置(如果要比較的元素是當前最小,則自己和自己交換),以此類推,直到遍歷了整個數組。這種方法叫做選擇排序,因為它會不斷地選擇剩余元素中的最小者。
初始值: | 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)) } }
選擇排序詳解