1排序
1.1冒泡排序
1比较相邻的元素,将大元素或者小元素放在二者之后。
2然后从头开始对每一对如此循环,最终在length-1次之后会把所有的元素排序成功
3由于每一次排序之后会确定一个元素位置,因此内层循环可以每次少排序1次
代码:
public static void main(String[] args) {
int [] arr={1,5,2,6,85,100,62,4};
//外层循环 需要length-1次循环才会确定整个数组的顺序
for (int i = 0; i < arr.length-1; i++) {
//内层循环 每次循环确定最后一个元素,因为每一大轮会确定一个数的位置因此每轮少一个元素对比 -i;
for (int j = 0; j < arr.length-1-i; j++) {
if (arr[j]>arr[j+1]) {
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
1.2 选择排序
1每次把最值放到左边
2把第一个当做是最小的 然后用cur记录下标,一次让第一个跟后面其他的数据进行对面,如果有比第一个小交换下标,当交换完后判断下标是否改变 (cur==i?)如果改变则交换数据
3 如此循环外层循环代表着每次确定最左边第i个数
public static void main(String[] args) {
int arr[] ={1,4,2,9,5,3,7};
//外层循环每一轮会确定一个最值到左边第i位,需要length-1次循环确定所有数据顺序
for (int i = 0; i < arr.length-1; i++) {
int cur=i; //记录最小值下标
//内层循环是从外层循环第i个数往后面的数据,不断比较,如果有小于第一个数据的则交换下标
for (int j = i+1; j < arr.length; j++) {
if (arr[cur]>arr[j]) {
cur=j;
}
}
//下标改变的话则说明有比最左边第i个数小的则交换数据
if (cur!=i) {
int temp=arr[cur];
arr[cur]=arr[i];
arr[i]=temp;
}
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
2 二分查找(折半查找)
1 设置首 中 尾 指针
2 当首指针大于尾指针才会跳出循环 找不到元素
3 当中间值大于目标值 则让尾指针放到中间值的左边
4 当中间值小于目标值 则让首指针放到中间值的右边
5 如此循环找到元素
public static void main(String[] args) {
int [] arr={1,2,3,4,5,9,12,15};
int target=5;
int a=n(arr, target);
System.err.println(a);
}
public static int n(int [] arr,int target) {
int firstCur =0;
int endCur = arr.length;
int middle =(firstCur+endCur)/2;
//当手指针大于尾指针才会跳出循环
while(firstCur<=endCur){
if (arr[middle]==target) {
return middle;
}
//当中间值大于目标值 则让尾指针放到中间值的左边
if (arr[middle]>target) {
endCur=middle-1;
}
// //当中间值小于目标值 则让首指针放到中间值的右边
else {
firstCur=middle+1;
}
middle =(firstCur+endCur)/2;
}
return -1;
}