选择排序法(C语言实现)

算法思想

遍历整个数组,在未排序的序列中找到最小(大)元素,存放到未排序序列的起始位置,然后再从剩下未排序中继续寻找最小(大)元素,放在未排序序列的起始位置,直到所有元素排序完成。

动画图解选择排序法

在这里插入图片描述

代码

#include <stdlib.h>
#include <stdio.h>
#include <time.h>



void show(int arr[],int len) //打印数组元素
{
	for (int i = 0; i < len; i++)
		printf("%d\t", arr[i]);
	printf("\n");
}

void selectsSort(int arr[],int len)//选择排序算法
{
	int tmp;
	for ( int i = 0;i < len - 1; i++)
	{
		for (int j = i + 1; j < len; j++)
			if (arr[i] > arr[j])
			{
				tmp = arr[i];
				arr[i] = arr[j];
				arr[j] = tmp;
			}
	}
}

void selectsSortOptimeze(int arr[], int len)//选择排序优化
{
	for (int i = 0; i < len - 1; i++)
	{
		int idx = i;
		for (int j = i + 1; j < len; j++)
		{
			if (arr[idx] > arr[j])
				idx = j;
		}
		if(idx != i)
		{
			   arr[idx] ^= arr[i];
				arr[i] ^= arr[idx];
				arr[idx] ^= arr[i];
		}
	}
}

//递归实现
//void Swap(int & min,int & arrData)//交换数据
//{
//	int tmp = min;
//	min = arrData;
//	arrData = tmp;
//}
//
//
//int FindMin(int arr[], int Start, int End) //找对最小数据的下标
//{
//
//	int min = Start;
//	for (int i = Start + 1; i < End; i++)
//	{
//		if (arr[min] > arr[i])
//			min = i;
//	}
//	return min;
//}
//
//void selectSortRecursion(int arr[], int Start, int End)//选择排序
//{
//	int i = 0;
//	if (Start<End)
//		int min = FindMin(arr,Start,End);
//	selectSortRecursion(arr, Start, End);
//}




int main()
{
	srand(time(NULL));
	int arr[10] = { 0 };
	int arrLen = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < arrLen; i++)
		arr[i] = rand() % 100;
	show(arr,arrLen);
	/*selectSortRecursion(arr, 1, arrLen);*/
	//selectsSort(arr,arrLen);
	selectsSortOptimeze(arr, arrLen);
	show(arr, arrLen);
}

运行测试

在这里插入图片描述

说明

第一种给出的选择排序算法,当前元素和后面每一个元素进行比较,并且只要比当前元素小都进行交换,最终使得当前元素是最小值。

第二种优化之后,我们只是标记出后面元素中最小的元素和当前元素进行交换,所以比较的过程次数是没有改变的,但是我们可以优化交换的次数。上面的动态图解也是我们优化之后的算法过程。

第三种我们给出的是递归实现,但是我的电脑不能运行,问题出现会出现栈溢出,所以只是作为了解。

最好情况时间:O(n ^ 2)
最坏情况时间:O(n ^ 2)

发布了163 篇原创文章 · 获赞 94 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43648751/article/details/104536546