八种排序算法之选择排序

#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循环,第一次用于确定基准值和选取次数,循环几次就是要选取几次最小元素,第二次循环主要用于排序,不断向后遍历,直到找到比基准值大或小的数据元素,和基准值交换(看你是升序还是降序)

猜你喜欢

转载自blog.csdn.net/rocky_56X/article/details/81711156