时间复杂度
算法的时间复杂度无非就是for、while等包含起来的进本运算单元的循环次数
时间复杂度排序:
O(1)<O(log2n)<O(n)<O(nlog2n)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)
冒泡排序
冒泡排序算法中,一次循环结束,就相当于确定了当前的最大值,也能确定最大值在数组中应存入的位置
时间复杂度:时间复杂度 O(n^2)
代码实现:
//传入一个数组的引用,将数组的元素进行升序排列
public static void bubbleSort(int[] arr){
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;
}
}
}
}
快速排序
时间复杂度:O(nlogn)
方法一:步骤:
1.将第一个元素放入临时变量作为基准数,0号位置空出坑位
2.从右开始移动指针找比基准数小的,找到放入0号坑位生成新的坑位
2.从左开始移动指针找比基准数大的,放入新的坑位
4.直到两个指针指向同一个索引,即两个指针指向同一个坑位
5.基准数放入这个坑位
方法二:步骤:
1.从右开始找比基准数小的
2.从左开始找比基准数大的
3.交换两个值的位置
4.红色继续往左找,蓝色继续往右找,直到两个箭头指向同一个索引为止
5.基准数归位
说明:最后左指针和右指针会指向同一个位置
①右靠左右边一直遍历到基准数位置,此时这个公共位置一定小于等于基准数:变换
②左靠右,左边一直遍历到右边的位置,这个位置就一定比基准数小,交换\
实现代码:
//快速排序:
public static void quickSort(int[] arr,int left,int right){
//递归结束条件
if(right<left){
return;
}
int left0=left;
int right0=right;
//基准数:
int baseNumber=arr[left];
//每当left=right就结束一次排序
while (left!=right){
//从右往左找比基准数小的
while (arr[right]>=baseNumber&&right>left){
right--;
}
//从左往右找比基准数大的
while (arr[left]<=baseNumber&&right>left){
left++;
}
//此时,左右下标指向同一个位置left=right
//交换左右两个下标位置的元素
int temp=arr[left];
arr[left]=arr[right];
arr[right]=temp;
}
//每交换一次后基准数归位
int temp=arr[left];
arr[left]=arr[left0];
arr[left0]=temp;
//递归调用
quickSort(arr,left0,left-1);
quickSort(arr,left+1,right0);
}
折半查找(二分查找)
必须是有序数组,从小到大排列好
时间复杂度:log2n,(是以2为底,n的对数)
代码实现:
//传入一个有序(从小到大排列)数组和一个数值,返回这个数值在数组中的下标,如果不存在,返回-1
public static int bynarySearch(int[] arr,int x){
int low=0;
int high=arr.length-1;
while (low<=high){
int middle=(low+high)/2;
if(arr[middle]==x){
return middle;
}else if(arr[middle]>x){
high=middle-1;
}else if(arr[middle]<x){
low=middle+1;
}
}
return -1;
}