基础算法——蛮力法(选择排序)

蛮力法


一、什么是蛮力法

  蛮力法,又称枚举法,是基础的算法之一。这是一种算法思想,顾名思义,就是将问题的可能结果全部都列举出来,再根据列举的结果根据问题的约束条件选择出问题的解。
  所依赖的技术最主要的是遍历,重复步骤。往往用这种算法去求解问题,时间复杂度会很大。但是确是最简单,直白容易想到的解法。
  思想还是得用实例来体现的,不然会感觉这个思想的东西只是思想,我们不会用的话,感觉这些思想没什么用,所以要用起来。选择排序是蛮力法的一个例子,我们应该抓住的是如何将这种思想应用起来,这才是关键。

二、例子——选择排序

1.问题

  选择排序方法对一个序列进行升序排序

2.基本思想

  听到选择排序,顾名思义,这是一种有选择的排序方法。怎么选择,如何体现蛮力?
  选择,就是将序列分为有序跟无序,这两部分,刚开始,有序部分的元素肯定为空集。接下来,就是所谓的蛮力的部分,开始不管三七二十一,就在无序的部分开始找啊,找到在无序中最小的数,将把最小的数与无序序列的第一个元素交换。到这一步后,又开始划有序与无序部分,这个时候,要把刚才找的最小的数放到有序部分中。这时,有序部分的元素就加1了,所谓排好一个了,还有剩下的元素在无序序列中。再开始蛮力部分。一直这样更新有序无序序列,蛮力;更新有序序列,蛮力。直至无序序列中没有元素。这样我们就实现了排序。
在这里插入图片描述

  大概想法是这样的,现在开始扣细节。因为这只是我们想法,计算机认识吗?当然不认识。我们要把我们的思想改得细致点。好了,我们知道蛮力法最重要的是遍历和重复步骤。我们要对整个序列进行排序,根据刚才的思想,序列中的每一个元素都会被挑出来重新放到有序序列中,所以,在这里可以用一个遍历去实现。然而,对于每一个的挑选的过程,是很蛮力的,就是一直在无序序列中找,比较。直至到无序序列的结尾。所以这也可以用遍历去实现。所以整体框架就是
重复(次数为原始序列个数,为更新有序与无序序列)
  开始找最小的值
    在无序序列中找到最小值
    交换值在无序序列中的位置

3.代码实现

void SelectSort(int array[],int n)
{
	int i,j,index,temp;
	for(i=0;i<n-1;i++)  //最外层遍历
	{
		index=i;//无序区的第一位
		for(j=i+1;j<n;j++) //开始找无序区的最小元素
			if(array[j]<array[index] index=j;   //记录最小值
		if(index!=i)
		{
		  temp=array[i];array[i]=array[index]; array[index]=temp; //将最小值放到有序区中
		}
	}
}

总结

对于蛮力法的应用,首先要明白它的特征,就是遍历,重复步骤的过程。要分析问题,哪些东西是在求解过程中是重复的,将这些东西提炼出来,先形成一个初步的求解轮廓,是不是这样就可以求解问题,然后在将这个轮廓逐渐细化。逐渐清晰,再转化为适用计算机的求解步骤,最后代码实现。蛮力法,就是简单粗暴,时间复杂度和空间复杂度往往较大,但是确是首先想到的方法。


版权声明:本文为weixin_43325858原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。