引入:交换两个变量的值
- 中间变量(开发常用)
int a=1;
int b=2;
int temp=a;
a=b;
b=temp;
- 位移运算交换(面试常用)
int a=1;
int b=2;
a=a^b;
b=a^b;
a=a^b;
- 加和运算
int a=1;
int b=2;
a=a+b;
b=a-b;
a=a-b;
冒泡排序
概念:
1 比较相邻的两个元素,如果第一个比第二大就交换位置
2 对每一对相邻的元素做相同的工作,从第一对一直比较到最后一对,比较一轮结束后,最后一个元素一定是最大的
3 针对所有元素,重复上面的步骤,除了最后一个元素
4 持续循环中,比较次数越来越少,一直剩下一个数据(没有一对了,只有一个了),比较结束
无基点,都是流动的 每一轮都会有 一个相对最大的数流动到右边,就是相当于,从大数开始放置,一直到最小的数
// 外层循环 判定从前往后比较完为一轮 需要几轮
// 相当于拿起第i个数去比较(靠内层去比较一轮),总共a.length个数,比较a.length-1个数,剩下的自然就是最小的
for(int i=1;i<a.length-1;i++) {
// System.out.println(i);
// 内层循环 判定不同轮次里需要比较几次
// 以下标进行比较 j得等于0(下标开始)最大下标比位数小1(所以小于),然后随轮次移动,部分数已就位不需要比较
// a.length-i注意下面比较的是j和j+1
for(int j=0;j<a.length-i;j++) {
// 判断是否交换,去移位,用下标
if(a[j]>a[j+1]) {
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
选择排序
- 每次把当中最小的放在最左边
- 先拿出第一个元素,假设其为最小,然后依次比较,在这个过程中如果有比第一个小的就交换位置,把最小的放在第一位
- 用临时变量去交换
目的是拿一个数和其他数比较取最小放在左边,每一个循环有一个基点,取的数放在基点
// 从小到大排序
public static void selectSort(int[] a) {
// 外层用于表示拿的数,基点位置
//为什么不是取(int i=1;i<a.length; )因为下方需要用到以这个为下标去比较
for(int i=0;i<a.length-1;i++) {
int min=i;
// 内层以基点的数和其后的数一一比较,并将最小的数的下标存入min
for(int j=i+1;j<a.length;j++) {
if(a[min]>a[j]) {
min=j;
}
}
// 对比最小数的下标和基点数下标是否相等,不等则换值
if(min!=i) {
int temp=a[i];
a[i]=a[min];
a[min]=temp;
}
}
}
二分法查找
要求: 必须是一个已经排序好的数组;且没有重复数据的干扰
思路:
数组中:
-
确定起始位置(0)和终止位置(arr.length-1)
-
判断中间位置是否符合要查询数
-
判断是升序还是降序还是空或null
升序: 目标大于中间 起始位置=中间位置+1,结束位置不变 目标小于中间 结束位置=中间位置-1, 起始位置不变 降序: 目标大于中间 结束位置=中间位置-1, 起始位置不变 目标小于中间 起始位置=中间位置+1,结束位置不变 空或null 返回-1
一个有序的数组,比较起始值,中间值,末尾值,不停的比较确定位置区域,缩小范围最终定位到该数据
// 升序
int[] arr= {1,2,3,4,5,6,77,88,99,100};
int a=5;
int Index=binarySearch(arr, a);
System.out.println(a+" 在数组上的位置下标为 "+Index);
}
public static int binarySearch(int[] arr,int a) {
// 先确定是否是空数组或null
if(arr==null||arr.length==0) {
return -1;
}
// 初始化起始和终止,以及中间位置
int start=0;
int end=arr.length-1;
int mid=(start+end)/2;
while(start<=end) {
if(a==arr[mid]) {
return mid;
}else if(a>arr[mid]){
// 目标大于中间 起始位置=中间位置+1,结束位置不变
start=mid+1;
}else {
// 目标小于中间 结束位置=中间位置-1, 起始位置不变
end=mid-1;
}
// 持续更新中间值下标
mid=(start+end)/2;
}
// 上面执行依然无结果,则数组中无该值,返回-1
return -1;
}