1、算法基本思想
以升序为例,用 min 表示最小值的下标,从第0个下标开始,比较第一趟,若发现某个值小于第0个下标的值,那么就把 min 置为当前下标,每趟比较结束后,比较 min 和 i 的值,如果发现不一样了,就将这两个下标对应的值交换顺序,执行 size - 1趟比较后,选择排序完成。
2、源代码
SelectSort
/*
* 函数名称:Swap
*
* 函数功能:交换数据
*
* 入口参数:a, b
*
* 出口参数:void
*
* 返回类型:void
*/
void Swap(int * a, int * b)
{
int tmp = 0;
assert(NULL != a);
assert(NULL != b);
tmp = *a;
*a = *b;
*b = tmp;
return;
}
/*
* 函数名称:SelectSort
*
* 函数功能:选择排序(普通)
*
* 入口参数:array, size
*
* 出口参数:void
*
* 返回类型:void
*/
void SelectSort(int array[], int len)
{
int i = 0;
int j = 0;
int min = 0;
for (i = 0; i < len - 1; i++)
{
min = i;
for (j = i + 1; j < len; j++)
{
if (array[j] < array[min])
{
min = j;
}
else
{
;
}
}
if (min != i)
{
Swap(array + i, array + min);
}
else
{
;
}
}
return;
}
main
#define _CRT_SECURE_NO_WARNINGS 1
/*
* Copyright (c) 2018, code farmer from sust
* All rights reserved.
*
* 文件名称:SelectSort.c
* 功能:选择排序
*
* 当前版本:V1.0
* 作者:sustzc
* 完成日期:2018年7月9日11:06:18
*/
# include <stdio.h>
# include <assert.h>
/*
* 函数名称:main
*
* 函数功能:测试主程序
*
* 入口参数:void
*
* 出口参数:0
*
* 返回类型:int
*/
int main(void)
{
int i = 0;
int numbers[] = {3, 1, 6, 4, 5, 2};
int len = sizeof(numbers) / sizeof(int);
printf("排序之前:\n");
for (i = 0; i < len; i++)
{
printf("%d ", numbers[i]);
}
SelectSort(numbers, len);
printf("\n排序之后:\n");
for (i = 0; i < len; i++)
{
printf("%d ", numbers[i]);
}
printf("\n");
return 0;
}
优化
第一次遍历中,最小下标放在左边,最大下标放在右边。然后根据这样的方式依次找到次小次大的……
/*
* 函数名称:SelectSort
*
* 函数功能:选择排序(优化)
*
* 入口参数:array, size
*
* 出口参数:void
*
* 返回类型:void
*/
void SelectSort(int array[], int size)
{
int i = 0;
int j = 0;
int max = 0; //最大值下标
int min = 0; //最小值下标
for (i = 0; i < size / 2; i++)
{
max = min = i;
for (j = i; j < size - i; j++)
{
if (array[j] < array[min])
{
min = j;
}
else
{
;
}
if (array[j] > array[max])
{
max = j;
}
else
{
;
}
}
Swap(array + i, array + min);
if (i == max)
{
max = min;
}
else if (i != max)
{
Swap(array + size - 1 - i, array + max);
}
else
{
;
}
}
return;
}
3、输出结果