# 简单排序

每一趟在待排序元素中选取关键字最小(或最大)的元素加入有序子序列

# 基本思想

从待排序序列中,找到关键字最小的元素;交换到序列的最前面(有序子序列的最后面)。下次循环,再从剩余的待排序元素中继续寻找最小的元素,放到有序子序列的最后面。以此类推,直到全部待排序的数据元素排完。

int arr = {9,1,2,5,7,4,8,6,3,5};

//第一躺简单排序 扫描数组中最小的值 与第一个元素交换位置
int arr = {1,9,2,5,7,4,8,6,3,5};

//第二躺简单排序 因为第一个元素已经是最小的了 所以从第二个元素开始扫描 找到最小的值 与第二个元素交换位置

//... 依次类推

//代码实现

void selectSort(int *arr, int length) {
    int i, j, min, temp;
    // 循环比较的次数
    for (i = 0; i < length - 1; ++i) {
        // 保存当前循环的下标
        min = i;
        // 从当前元素的下一个元素开始,依次和当前元素比较,如果比当前元素小,那么就将该元素的下标保存到min中
        for (j = i + 1; j < length; ++j) {
            if (arr[j] < arr[min]) {
                min = j;
            }
        }
        // 如果min不等于i,那么就说明找到了比当前元素更小的元素,那么就将这两个元素交换位置
        if (min != i) {
            temp = arr[i];
            arr[i] = arr[min];
            arr[min] = temp;
        }
    }
}

# 算法分析

# 空间复杂度

O(1)

# 时间复杂度

无论是否有序,都需要进行 n(n-1)/2 次比较,时间复杂度为 O(n^2) O(n^2)