【C】排序算法之选择排序

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、输出结果


猜你喜欢

转载自blog.csdn.net/sustzc/article/details/81055590