时间复杂度
(1)找出数组中的最大值
初始化一个变量max,遍历数组,和max比较(比较是常数级操作),时间复杂度为N和常数的乘积
(2) 在有序数组中找目标数
二分法:每次砍掉一半 代价:log2N
(3) 有序数组A(长度为N),有序数组B(长度为M) 找出数组A和数组B的公共部分
思路一:
A中的每个元素和B中的每个元素比较
for(1… M) { for (1…N) }
时间复杂度:O(N*M)
思路二:
二分查找
for(1…M){ 在A中二分查找}
时间复杂度:O(N*logM)
思路三:
每个数组的起始位置设一个指针,比较,谁小谁动,一定可以找到相同的数,然后一起动,最多动N+M次
时间复杂度:O(N+M)
空间复杂度
(额外空间:输入输出不算在额外空间中)
以空间置换时间
(1)数组左右部分交换 比如 123 45 输出 45 123
思路一 :
找一个辅助数组,拷贝右边的到该数组中,再把左边的拷贝到该数组
思路二:
各部分先逆序,然后整体逆序
比如 12345 67
各部分逆序:54321 76
整体逆序:67 12345
(逆序不占用额外空间)
对数器
作用:生成大量的测试用例,来验证程序正确。
对数器构造框架:
待测方法a,
- 实现一个绝对正确但是复杂度不好的方法b,
- 实现一个随机样本产生器
- 实现比对的方法
- 把方法a和方法b比对很多次来验证方法a是否正确。
- 如果有一个样本使得比对出错, 打印样本分析是哪个方法出错
- 当样本数量很多时比对测试依然正确, 可以确定方法a已经正确。
冒泡排序
public class bubbleSort0 {
public static void bubble(int[] arr){
if(arr == null || arr.length <2){
return ;
}
for(int i = 0;i<arr.length;i++){
for(int j = 0;j<arr.length-i-1;j++){
if(arr[j]>arr[j+1]){
swap(arr,j,j+1);
}
}
}
}
private static void swap(int[] arr,int a,int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
public static void main(String[] args) {
int[] a = {
1,4,32,34,22,12};
bubble(a);
for(int i = 0;i<a.length;i++){
System.out.println(a[i]);
}
}
}
注意:
下面这个交换方法是错的:
public static void swap_error(int a, int b) {
int temp = a;
a = b;
b = temp;
}
这样的方法再C++中可以,但是java中无效,原因是java基本数据类型为值传递,swap_error中的参数a和b为形参,调用此方法的arr[j]和arr[j+1]为实参,实参将值传递给a,b,由形参ab进行值的交换,由于不是引用传递而是值传递,在调用此方法后,arr[j]和arr[j+1]还是没有变化
引入对数器:
生成随机大小的随机数组
public static int[] generateRandomArray(int maxsize, int maxValue) {
//Math.random():随机获得在0和1之间的一个数([0,1)) 如果maxsize 是100 则arr的大小取值范围为[0,100]
int[] arr = new int[(int) ((maxsize + 1) * Math.random())];
for (int i = 0; i < arr.length; i++) {
//值是随机的
arr[i] = (int) ((maxValue + 1) * Math.random() - (int) (maxValue * Math.random()));
}
return arr;
}
绝对正确的方法:
public static void comparator(int[] arr) {
Arrays.sort(arr);
}
对比的方法:
public static boolean isEqual(int[] arr1, int[] arr2) {
if ((arr1 == null) && (arr2 != null) || (arr1 != null && arr2 == null)) {
return false;
}
if (arr1 == null && arr2 == null) {
return true;
}
if (arr1.length != arr2.length) {
return false;
}
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i]) {
return false;
}
}
return true;
}
整体代码:
import java.util.Arrays;
public class bubbleSort {
public static void bubbleSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
// int temp = arr[j];
// arr[j] = arr[j+1];
// arr[j+1] = temp;
swap(arr, j, j + 1);
}
}
}
}
public static void swap(int arr[], int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
public static void comparator(int[] arr) {
Arrays.sort(arr);
}
public static int[] generateRandomArray(int maxsize, int maxValue) {
//Math.random():随机获得在0和1之间的一个数([0,1)) 如果maxsize 是100 则arr的大小可能是[0,100]
int[] arr = new int[(int) ((maxsize + 1) * Math.random())];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) ((maxValue + 1) * Math.random() - (int) (maxValue * Math.random()));
}
return arr;
}
public static boolean isEqual(int[] arr1, int[] arr2) {
if ((arr1 == null) && (arr2 != null) || (arr1 != null && arr2 == null)) {
return false;
}
if (arr1 == null && arr2 == null) {
return true;
}
if (arr1.length != arr2.length) {
return false;
}
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i]) {
return false;
}
}
return true;
}
public static int[] copyArray(int[] arr) {
if (arr == null) {
return null;
}
int[] res = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
res[i] = arr[i];
}
return res;
}
public static void printArray(int[] arr) {
if (arr == null) {
return;
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
int testTime = 50000000;
int maxSize = 100;
int maxValue = 100;
boolean succeed = true;
for (int i = 0; i < testTime; i++) {
int[] arr1 = generateRandomArray(maxSize, maxValue);
int[] arr2 = copyArray(arr1);
bubbleSort(arr1);
comparator(arr2);
if (!isEqual(arr1, arr2)) {
succeed = false;
printArray(arr1);
printArray(arr2);
break;
}
}
System.out.println(succeed ? "nice" : "bad");
}
}