Skip to content

选择排序的原理详解与 C 语言实现

Posted on:2024年6月20日 at 17:15

选择排序(Selection Sort)是一种简单直观的排序算法。它的主要思想是每次从未排序的部分中选择最小(或最大)的元素,放到已排序部分的末尾,直到所有元素都已排序。选择排序的时间复杂度是 (O(n^2)),其中 (n) 是数组的长度,因此在大多数情况下,选择排序并不适用于处理大规模的数据。

选择排序的步骤

  1. 从未排序部分中找到最小(或最大)的元素。
  2. 将该元素与未排序部分的第一个元素交换位置。
  3. 重复上述步骤,直到所有元素都已排序。

选择排序的优缺点

优点

缺点

C 语言实现选择排序

#include <stdio.h>

// 函数声明
void selectionSort(int arr[], int n);
void swap(int *xp, int *yp);
void printArray(int arr[], int size);

int main() {
    int arr[] = {64, 25, 12, 22, 11};
    int n = sizeof(arr) / sizeof(arr[0]);
    printf("未排序的数组: \n");
    printArray(arr, n);
    
    selectionSort(arr, n);
    
    printf("排序后的数组: \n");
    printArray(arr, n);
    
    return 0;
}

// 选择排序函数
void selectionSort(int arr[], int n) {
    int i, j, min_idx;
    
    // 一一遍历数组
    for (i = 0; i < n-1; i++) {
        // 将当前下标设为最小值下标
        min_idx = i;
        
        // 在未排序部分找到最小值的下标
        for (j = i+1; j < n; j++) {
            if (arr[j] < arr[min_idx]) {
                min_idx = j;
            }
        }
        
        // 将最小值与未排序部分的第一个元素交换位置
        swap(&arr[min_idx], &arr[i]);
    }
}

// 交换两个整数值的函数
void swap(int *xp, int *yp) {
    int temp = *xp;
    *xp = *yp;
    *yp = temp;
}

// 打印数组的函数
void printArray(int arr[], int size) {
    int i;
    for (i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

代码解释

  1. 函数声明

    • selectionSort(int arr[], int n):排序函数,参数是数组和数组长度。
    • swap(int *xp, int *yp):交换函数,用于交换两个整数的值。
    • printArray(int arr[], int size):打印数组函数,用于输出数组的内容。
  2. main 函数

    • 初始化一个数组 arr,并计算其长度 n
    • 打印未排序的数组。
    • 调用 selectionSort 函数进行排序。
    • 打印排序后的数组。
  3. selectionSort 函数

    • 遍历数组,每次找到未排序部分的最小值,将其与未排序部分的第一个元素交换。
    • 使用内嵌循环来查找最小值的下标 min_idx
  4. swap 函数

    • 使用指针交换两个整数的值。
  5. printArray 函数

    • 遍历数组并打印每个元素。