06.2 选择排序

2024 年 7 月 22 日 星期一(已编辑)
1
摘要
选择排序是一种简单直观的排序算法,通过多次遍历数组,在每轮遍历中选择未排序部分的最小元素并将其放置到已排序部分的末尾。选择排序的时间复杂度为O(n^2),适用于处理小规模数据集或对稳定性不作要求的情况。虽然不如快速排序或归并排序等高效算法,但选择排序简单易懂,不需要额外内存空间。
这篇文章上次修改于 2024 年 8 月 9 日 星期五,可能部分内容已经不适用,如有疑问可询问作者。

06.2 选择排序

选择排序详解

1. 引言

选择排序是一种简单直观的排序算法,其核心思想是通过多次遍历数组,在每轮遍历中选择未排序部分的最小元素并将其放置到已排序部分的末尾。

2. 选择排序原理

选择排序的基本思路是通过不断选择最小的元素,逐步构建有序序列。在每一轮遍历中,找到未排序部分的最小元素,并与未排序部分的第一个元素交换位置,将其纳入已排序的部分。

3. 选择排序步骤

选择排序的具体步骤如下:

  1. 在未排序部分选择最小元素。
  2. 将最小元素与未排序部分的第一个元素交换位置,将其纳入已排序部分。
  3. 重复以上步骤,直至整个数组有序。

4. 选择排序代码

4.1 Python选择排序代码

def selection_sort(arr):
    n = len(arr)

    for i in range(n):
        # 假设当前索引为i的元素为最小
        min_index = i

        # 在未排序部分找到最小元素的索引
        for j in range(i+1, n):
            if arr[j] < arr[min_index]:
                min_index = j

        # 将找到的最小元素与未排序部分的第一个元素交换位置
        arr[i], arr[min_index] = arr[min_index], arr[i]

# 示例
arr = [64, 34, 25, 12, 22, 11, 90]
selection_sort(arr)
print("排序后的数组:", arr)

4.2 Java选择排序代码

package org.example;  
  
import java.util.Arrays;  
  
public class SelectSort {  
    public static void main(String[] args) {  
        int arr[] = {-1, -2, 3, 7, 4, 10};  
        System.out.println("排序前:" + Arrays.toString(arr));  
        selectSort(arr);  
    }  
  
    public static void selectSort(int[] arr) {  
        //算法 先简单=》后复杂  
        //第一轮:-1, -2, 3, 7, 4, 10,选择最小的与第一位交换,-2, -1, 3, 7, 4, 10  
  
        //第一轮找到了最小的值与索引  
  
  
//        for (int j = 0 + 1; j < arr.length; j++) {  
//            if (min > arr[j]) {  
//                min = arr[j];  
//                minIndex = j;  
//            }  
//        }  
//        //将最小值放在arr[0],交换  
//        if (minIndex != 0) {  
//            arr[minIndex] = arr[0];  
//            arr[0] = min;  
//        }  
//        System.out.println("第1轮:" + Arrays.toString(arr));  
//  
//        //第2轮找到了最小的值与索引,因为第一个位置已经确定  
//        minIndex = 1;  
//        min = arr[1];  
//        for (int j = 1 + 1; j < arr.length; j++) {  
//            if (min > arr[j]) {  
//                min = arr[j];  
//                minIndex = j;  
//            }  
//        }  
//        //将最小值放在arr[0],交换  
//        if (minIndex != 1) {  
//            arr[minIndex] = arr[1];  
//            arr[1] = min;  
//        }  
//        System.out.println("第2轮:" + Arrays.toString(arr));  
//  
//  
//        //第2轮找到了最小的值与索引,因为第一个位置已经确定  
//        minIndex = 2;  
//        min = arr[2];  
//        for (int j = 2 + 1; j < arr.length; j++) {  
//            if (min > arr[j]) {  
//                min = arr[j];  
//                minIndex = j;  
//            }  
//        }  
//        //将最小值放在arr[0],交换  
//        if (minIndex != 2) {  
//            arr[minIndex] = arr[2];  
//            arr[2] = min;  
//        }  
//        System.out.println("第3轮:" + Arrays.toString(arr));  
  
        for (int i = 0; i < arr.length - 1; i++) {  
            int minIndex = i;  
            int min = arr[i];  
  
            for (int j = i + 1; j < arr.length; j++) {  
                if (min > arr[j]) {  
                    min = arr[j];  
                    minIndex = j;  
                }  
            }  
            //将最小值放在arr[0],交换  
            if (minIndex != i) {  
                arr[minIndex] = arr[i];  
                arr[i] = min;  
            }  
            System.out.printf("第%d轮:",i + 1);  
            System.out.println(Arrays.toString(arr));  
        }  
    }  
}

5. 选择排序的时间复杂度

选择排序的时间复杂度为O(n^2),其中n为数组的长度。这是因为在每一轮遍历中,需要在未排序部分选择最小元素。

6. 总结

选择排序虽然不如一些高效的排序算法,但它简单、直观,并且不需要额外的内存空间。在处理小规模数据集或对稳定性不作要求时,选择排序是一种可行的选择。然而,在实际应用中,通常会优先选择更为高效的排序算法,如快速排序或归并排序。

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...