什么是选择排序?
选择排序是一种简单直观的排序算法,它的核心思想是每次从未排序的元素中选择最小(或最大)的元素,然后将其放到已排序序列的末尾。通过重复这个过程,直到所有元素都排好序为止。
选择排序的详细步骤
1、首先,从待排序的数组中找到最小(或最大)的元素,记为最小元素。
2、将最小元素与数组的第一个元素进行交换,将最小元素放到已排序序列的末尾。
3、接下来,在剩余的未排序元素中,再次寻找最小(或最大)的元素,重复步骤2。
4、重复执行上述步骤,直到所有元素都排好序。
举例说明
假设我们有以下待排序的数组:[5, 2, 9, 1, 5, 6]。
第一轮: 在数组中找到最小的元素,这是1。然后将1与数组的第一个元素(即5)交换位置。数组变为:[1, 2, 9, 5, 5, 6]。
第二轮: 在未排序的部分中([2, 9, 5, 5, 6])找到最小元素,这是2。将2与未排序部分的第一个元素(即2)交换位置。数组保持不变,为:[1, 2, 9, 5, 5, 6]。
第三轮: 在未排序的部分中([9, 5, 5, 6])找到最小元素,这是5。将5与未排序部分的第一个元素(即9)交换位置。数组变为:[1, 2, 5, 9, 5, 6]。
第四轮: 在未排序的部分中([9, 5, 6])找到最小元素,这是5。将5与未排序部分的第一个元素(即9)交换位置。数组变为:[1, 2, 5, 5, 9, 6]。
第五轮: 在未排序的部分中([9, 6])找到最小元素,这是6。将6与未排序部分的第一个元素(即9)交换位置。数组变为:[1, 2, 5, 5, 6, 9]。
最终,整个数组变得有序:[1, 2, 5, 5, 6, 9]。
关键
选择排序的关键点是每一轮内层循环都找到了当前范围内的最小(或最大)元素,并将其放到已排序序列的末尾。通过不断缩小排序范围,每次排序都能找到最小(或最大)的元素,并逐步构建有序序列。
示例代码
#include <stdio.h>
void ChoiceSort(int arr[], int length);
int main()
{
int arr[] = {5, 2, 9, 1, 5, 6};
/*
不可以放在函数内部,
当数组作为函数参数传递给函数时,
数组参数会被转换为指针类型,
因此在函数内部无法通过sizeof操作符获取数组的长度。
*/
int length = sizeof(arr) / sizeof(arr[0]);
ChoiceSort(arr, length);
return 0;
}
void ChoiceSort(int arr[], int length)
{
int i, j, k;
for (i = 0; i < length; i++)
{
int minIndex = i; // 最小数的下标,每个循环开始总是假设第一个数最小
for (j = i + 1; j < length; j++)
{
if (arr[j] < arr[minIndex]) // 找到最小的数
{
minIndex = j; // 保存最小数的索引
}
}
printf("第%d轮最小数为:%d\n",i+1,arr[minIndex]);
int temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
for (k = 0; k < length; k++)
{
printf("%d ", arr[k]);
}
printf("\n======================\n");
}
}