#include <stdio.h>
// 交换数组中下标为 i 和下标为 j 的元素的值
void swap(int *a, int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
// 选择排序
void sort(int *a, int len)
{
// 在数组中下标找最小元素的下标
int i, j;
for (j = 0; j < len-1; j++) // 找 len-1 最小元素和 "当前数组" 第一个元素进行交换
{
int startIndex = j; //startIndex为基准值,之后就是向后遍历
int min = startIndex; //min是最小值序号
for (i = startIndex+1; i < len; i++)//向后遍历,发现小于min的,交换序号,
{
if (a[i] < a[min])
min = i;
}
if (min != startIndex) //如果序号不相同,表示最小值不是基准值,需要交换
swap(a, min, startIndex); //此举可以让排序具有稳定性
}
}
// 选择排序:递归
void sort1(int *a, int start, int end)
{
if (start == end-1)
return;
int i;
int min = start;
for (i = start+1; i < end; i++)
{
if (a[i] < a[min])
min = i;
}
if (min != start)
swap(a, min, start);
sort1(a, start+1, end);
}
// 打印数组
void print(int *a, int len)
{
int i;
for (i = 0; i < len; i++)
printf ("%4d", a[i]);
printf ("\n");
}
int main()
{
int a[] = {2,7,4,1,3,5,6};
int len = sizeof(a)/sizeof(a[0]);
// sort(a, len);
// print(a, len);
sort1(a, 0, len);
print(a, len);
return 0;
}
选择排序的主要思想是:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
程序表现主要是两次for循环,第一次用于确定基准值和选取次数,循环几次就是要选取几次最小元素,第二次循环主要用于排序,不断向后遍历,直到找到比基准值大或小的数据元素,和基准值交换(看你是升序还是降序)