蛮力法
蛮力法又称穷举法和枚举法,是一种简单直接地解决问题的方法,常常直接基于问题的描述,所以蛮力法也是最容易应用的方法。但是蛮力法所设计的算法时间特性往往是比较低的,典型的指数时间算法一般都是通过蛮力搜索得到的。所谓的指数时间算法,是指输入资料的数量依线性成长,所花的时间将会以指数成长。
应用
常用的蛮力法应用算法有我们比较熟悉的冒泡排序、选择排序。
选择排序
是一种简单直观的排序算法。
它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
以此类推,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
实现步骤
接下来,实现选择排序,基于将最大的值排到最后。初始代码如下:
/**
* @Author: AndyLin
* @Title: selectSort
* @Description: 选择排序
* @param: array
*/
public static void selectSort(int[] array){
for(int i=0;i<array.length-1;i++) {
int index = i;
for (int j = i+1; j < array.length; j++) {
if (array[j] < array[index]) {
index = j;
}
}
int temp = array[index];
array[index] = array[i];
array[i] = temp;
}
}
时间复杂度分析
选择排序的交换操作介于 0 和 (n - 1) 次之间。选择排序的比较操作为 n (n - 1) / 2 次之间。选择排序的赋值操作介于 0 和 3 (n - 1) 次之间。
比较次数O(n^2),比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+...+1=n*(n-1)/2。交换次数O(n),最好情况是,已经有序,交换0次;最坏情况交换n-1次,逆序交换n/2次。交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。
性能改进
/**
* @Author: AndyLin
* @Title: selectSort
* @Description: 选择排序
* @param: array
*/
public static void selectSort(int[] array){
for(int i=0;i<array.length-1;i++) {
int index = i;
for (int j = i+1; j < array.length; j++) {
if (array[j] < array[index]) {
index = j;
}
}
if(index!=i) {//如果已经是最小的,就不需要交换
int temp = array[index];
array[index] = array[i];
array[i] = temp;
}
}
}