1.2 选择排序

83 阅读1分钟

1. 算法步骤

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。

再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

重复第二步,直到所有元素均排序完毕。

  1. 动图演示

selectionSort.gif

代码实现

JavaScript 代码实现

实例

function selectionSort(arr) {
var len = arr.length;
var minIndex, temp;
for (var i = 0; i < len - 1; i++) {
minIndex = i;
for (var j = i + 1; j < len; j++) {
if (arr[j] < arr[minIndex]) {     // 寻找最小的数
minIndex = j;                 // 将最小数的索引保存
}
}
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
return arr;
}

Python 代码实现

实例

def selectionSort(arr):
for i in range(len(arr) - 1):
# 记录最小数的索引
minIndex = i
for j in range(i + 1, len(arr)):
if arr[j] < arr[minIndex]:
minIndex = j
# i 不是最小数时,将 i 和最小数进行交换
if i != minIndex:
arr[i], arr[minIndex] = arr[minIndex], arr[i]
return arr

Go 代码实现

实例

func selectionSort(arr []int) []int {
length := len(arr)
for i := 0; i < length-1; i++ {
min := i
for j := i + 1; j < length; j++ {
if arr[min] > arr[j] {
min = j
}
}
arr[i], arr[min] = arr[min], arr[i]
}
return arr
}

Java 代码实现

实例

public class SelectionSort implements IArraySort {

    @Override
public int[] sort(int[] sourceArray) throws Exception {
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

        // 总共要经过 N-1 轮比较
for (int i = 0; i < arr.length - 1; i++) {
int min = i;

            // 每轮需要比较的次数 N-i
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[min]) {
// 记录目前能找到的最小值元素的下标
min = j;
}
}

            // 将找到的最小值和i位置所在的值进行交换
if (i != min) {
int tmp = arr[i];
arr[i] = arr[min];
arr[min] = tmp;
}

        }
return arr;
}
}

PHP 代码实现

实例

function selectionSort(arr) {     len = count(arr);   for (arr);     for (i = 0; i < i < len - 1; i++) {         minIndex = i;     for (i;         for (j = i + 1; i + 1; j < len; len; j++) {
if (arr[arr[j] < arr[arr[minIndex]) {
minIndex = minIndex = j;
}
}
temp = temp = arr[i];     i];         arr[i] = i] = arr[minIndex];     minIndex];         arr[minIndex] = minIndex] = temp;
}
return $arr;
}

C 语言

实例

void swap(int *a,int *b) //交換兩個變數
{
int temp = *a;
*a = *b;
*b = temp;
}
void selection_sort(int arr[], int len)
{
int i,j;

        for (i = 0 ; i < len - 1 ; i++)
{
int min = i;
for (j = i + 1; j < len; j++)     //走訪未排序的元素
if (arr[j] < arr[min])    //找到目前最小值
min = j;    //紀錄最小值
swap(&arr[min], &arr[i]);    //做交換
}
}

C++

实例

template<typename T> //整數或浮點數皆可使用,若要使用物件(class)時必須設定大於(>)的運算子功能
void selection_sort(std::vector& arr) {
for (int i = 0; i < arr.size() - 1; i++) {
int min = i;
for (int j = i + 1; j < arr.size(); j++)
if (arr[j] < arr[min])
min = j;
std::swap(arr[i], arr[min]);
}
}

C#

实例

static void selection_sort(T[] arr) where T : System.IComparable{//整數或浮點數皆可使用
int i, j, min, len = arr.Length;
T temp;
for (i = 0; i < len - 1; i++) {
min = i;
for (j = i + 1; j < len; j++)
if (arr[min].CompareTo(arr[j]) > 0)
min = j;
temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}

Swift

实例

import Foundation
/// 选择排序
///
/// - Parameter list: 需要排序的数组
func selectionSort(_ list: inout [Int]) -> Void {
for j in 0..<list.count - 1 {
var minIndex = j
for i in j..<list.count {
if list[minIndex] > list[i] {
minIndex = i
}
}
list.swapAt(j, minIndex)
}
}

Kotlin 实现

class SelectionSort { 
    /** 
    * 拓展IntArray为他提供数据两个数交换位置的方法 
    * @param i 第一个数的下标 
    * @param j 第二个数的下标 
    */ 
    fun IntArray.swap(i:Int,j:Int){ 
        var temp=this[i] 
        this[i]=this[j] 
        this[j]=temp 
    } 
    fun selectionSort(array: IntArray):IntArray{
        for (i in array.indices){ 
            //假设最小值是i 
            var min=i 
            var j=i+1 
            while (j in array.indices){ 
                if (array[j]<array[min]){ 
                    min=j
                }
                j++ 
            } 
            if (i!=min){
                array.swap(i,min) 
            } 
        } 
        return array; 
    }
}

rust 版本的实现

fn selection_sort<T:Ord + Debug>(array: &mut [T]) {
    for i in 0..array.len() {
        let mut temp = i;
        for j in i..array.len() {
            if array[j] < array[temp] {
                temp = j;
            }
        }
        array.swap(i, temp);
    }
}

原文地址:github.com/hustcc/JS-S…

参考地址:zh.wikipedia.org/wiki/%E9%80…