选择排序是一种简单直观的排序算法,其原理如下:
1. 遍历数组,找到最小(或最大)的元素,并将其与数组的第一个元素交换位置。
2. 接着在剩下的元素中找到最小(或最大)的元素,并将其与数组的第二个元素交换位置。
3. 以此类推,每次在剩下的未排序元素中找到最小(或最大)的元素,放到已排序部分的末尾。
4. 最终整个数组就会被排序完成。
定义一个数组 int a[] = {4,6,8,5,9},要求利用选择排序的方法将数组从小到大排序。
排序的次数:因为每排好一个元素,那么所需要排的元素个数减一,直到排到倒数第二个元素停止,将倒数第二个元素也排好后,整体数组排序就完成了。所以排序的次数 = 元素个数 - 1。(冒泡排序的排序次数与该排序的排序次数计算方法相同)
所以以min来记录较小元素的小标,i和j结合来遍历数组,初始的时候min和i都指向数组的首元素,j指向下一个元素,j开始从右向左进行遍历数组元素,若有元素比min元素更小则进行交换,然后min为更小元素的小标,i再向右走,这样循环到i走到最后一个元素就完成了排序,过程如下图所示:
代码如下:
#include <stdio.h>
int main() {
int i, j, min, t,n;
int a[] = {4, 6, 8, 5, 9};
n = sizeof(a) / sizeof(a[0]);
for (i = 0; i < n-1; i++) {
min = i;
for (j = i+1; j < n; j++) {
if (a[j] < a[min])
min = j;
}
t = a[i];
a[i] = a[min];
a[min] = t;
}
printf("结果为:");
for (int i = 0; i < n; i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}
结果为:
结果为:4 5 6 8 9
请按任意键继续. . .
选择排序的时间复杂度为O(n^2),并且是不稳定的排序算法。虽然选择排序的时间复杂度较高,但是它的实现简单,适用于小规模数据的排序。