设计思想:
蛮力法采用一定的策略依次处理待求解问题的所以元素(穷举所有可能的解),从而找出问题的解。
优点:
1.适应性强,所有问题都可以用它解决。
2.容易实现。
3.问题规模不大的都可以用它立刻得到解。
4.有些问题只能用穷举法。(求一组数的最大值)
缺点:
性能往往不好,时间复杂度达到指数级。
例子:
选择排序
/**
* 选择排序
* 设计思想:
* 从所有元素中选择最小的,放在第一个位置中。
* 然后再从剩下的所有元素中,选择一个最小的放在第二个元素中。
* 依次类推
*/
public static void selectionSort(int[] arr) {
/*判断数组为空或为一个元素的情况,即边界检查*/
if (arr == null || arr.length < 2) {
return;
}
/*每次要进行比较的两个数,的前面那个数的下标*/
for (int i = 0; i < arr.length - 1; i++) {
//min变量保存该趟比较过程中,最小元素所对应的索引,
//先假设前面的元素为最小元素
int minIndex = i;
/*每趟比较,将前面的元素与其后的元素逐个比较*/
for (int j = i + 1; j < arr.length; j++) {
//如果后面的元素小,将后面元素的索引极为最小值的索引
if(arr[j] < arr[minIndex]) {
minIndex = j;
}
}
//然后交换此次查找到的最小值和原始的最小值
swap(arr, i, minIndex);
}
}
public static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
冒泡排序
/**
* 冒泡排序
* 从第一个元素开始。每个元素和后面的元素比较,如果逆序。则交换,得到第一个最大的元素
* 依次类推
*/
public static void bubbleSort(int[] arr) {
/*判断数组为空或为一个元素的情况,即边界检查*/
if (arr == null || arr.length < 2) {
return;
}
/*规定每次两两比较的末尾元素的位置,最多为数组的最后一个位置*/
for (int end = arr.length - 1; end > 0; end--) {
/*从第一个元素开始,两两进行比较,如果前面的元素大于后面的
元素,就交换,最终的结果就是最大的数在最后面
*/
for (int i = 0; i < end; i++) {
if (arr[i] > arr[i + 1]) {
swap(arr, i, i + 1);
}
}
}
}
//交换
public static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}