1 算法步骤

  1. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
  2. 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
  3. 重复第二步,直到所有元素均排序完毕。

排序——SelectionSort选择 - 图1

代码实现

Python 代码实现

  1. def selectionSort(arr):
  2. for i in range(len(arr) - 1):
  3. # 记录最小数的索引
  4. minIndex = i
  5. for j in range(i + 1, len(arr)):
  6. if arr[j] < arr[minIndex]:
  7. minIndex = j
  8. # i 不是最小数时,将 i 和最小数进行交换
  9. if i != minIndex:
  10. arr[i], arr[minIndex] = arr[minIndex], arr[i]
  11. return arr

Go 代码实现

  1. func SelectionSort(a []int){
  2. for i:=0;i<len(a);i++{
  3. minIndex :=i
  4. for j:=i+1;j<len(a);j++{
  5. if a[j]>a[minIndex]{
  6. a[j],a[minIndex] = a[minIndex],a[j]
  7. }
  8. }
  9. }
  10. }
  11. func SelectionSort1(a []int){
  12. for i:=0;i<len(a);i++{
  13. minIndex :=i
  14. for j:=i+1;j<len(a);j++{
  15. if a[j]>a[minIndex]{
  16. // 减少交换次数
  17. //a[j],a[min] = a[min],a[j]
  18. j = minIndex // 找到坐标点
  19. }
  20. }
  21. if i!=minIndex {
  22. a[i],a[minIndex] = a[minIndex],a[i]
  23. }
  24. }
  25. }

Java 代码实现

public  static int [] selectSort(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;
            // 每轮需要后面的元素进行比较
            for(int j = i+1;j<arr.length;j++){
                if (arr[min]>arr[j])
                    min = j;
            }
            //将找到的最小值和当前坐标进行交换
            if (i!=min){
                int tmp = arr[i];
                arr[i] = arr[min];
                arr[min] = tmp;
            }
        }
        return arr;
    }

或者

private int[] selectionSort(int[] arrays) {
        for (int i = 0; i < arrays.length; i++) {
            int minIndex = i;
            for (int j = i; j < arrays.length; j++) {
                if (arrays[j] < arrays[minIndex]) {
                    minIndex = j;
                }
            }
            int tmp = arrays[i];
            arrays[i] = arrays[minIndex];
            arrays[minIndex] = tmp;
            System.out.print("第" + i + "次交换:");
            printAll(arrays);
        }
        return arrays;
    }