一、闲的无聊,写了个这么玩意,锻炼一下自己的逻辑思维。
二、总觉得有时候死记硬背不是好办法,所以讲自己的思路也写上了。
三、code
package com.alex.select;
import java.util.Arrays;
import org.junit.Test;
public class MathSelect {
@Test
public void fun1(){
int[] arr1 = {3,2,5,3,8,0};
int[] arr2 = {3,2,5,3,8,0};
//使用选择排序,对数组arr1进行从小到大的排序
arr1 = this.selectSort(arr1);
System.out.println(Arrays.toString(arr1));
//使用冒泡排序,对数组arr2进行从小到大的排序
arr2 = this.bubboSort(arr2);
System.out.println(Arrays.toString(arr2));
//使用折半查找,对排序后的数组进行目标对象为8的查找,返回其索引
System.out.println(halfSelect(arr2,3));;
}
/**
* 选择排序的原则:
* 1.开始的时候,n个萝卜占好了各自的坑,等待我们进行排序;
* 2.获取到第i坑(i指坑的索引),此时说明,前面的i(数量)个坑已经排完放好了正确的萝卜。
* 3.每次都拿i+1个坑后面的所有萝卜和第i坑里的萝卜对比;
* 4.如果后面的大,就兑换个,否则保持不变。
* @param arr
* @return
*/
public int[] selectSort(int[] arr){
//按照有n个坑,从第一个坑往里塞萝卜的思路完成排序,从第一个坑到倒数第二个坑,因为倒数第一个在前面的排好后就自动排好了
for (int i = 0; i < arr.length-1; i++) {
//第索引为i的坑,获取其萝卜
for (int j = i+1; j < arr.length; j++) {//拿索引为i+1的一直到最后索引为n-1坑里的萝卜都和索引为i的对比大小
//索引为j的坑,获取其萝卜
int temp = arr[i];//原有的萝卜
if (arr[i] > arr[j]) {
arr[i] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
/**
* 冒泡算法的原则:
* 1.没外层循环一次,都要确定出最后一位最大数;
* 2.每次循环都是从首位开始,然后,将较大者往后放;
* 3.数值的比较在于相邻两个数字的数值比较;
* 4.n个数排序的话,外层循环为n-1次,因为当前n-1个数值确定了之后,最后一位的位置也就是确定的了。
* 5.内存循环用来进行相邻数字的数值比较;
* 6.如果目标对象在数组中有多个,不确定返回的是哪个对象的索引;
* @param arr
* @return
*/
public int[] bubboSort(int[] arr){
for (int i = 0; i < arr.length-1; i++) {//外层循环总共循环n-1次
for (int j = 0; j < arr.length-i-1; j++) {//外层为i表示已经确定了i个数的位置,确定角标为i的位置的数的时候,应该循环n-i-1次;
int temp = arr[j];
if (arr[j]>arr[j+1]) {
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr;
}
/**
* 折半查找的前提是给定的数组必须是有序数组,否则无法准确找出值,折半查找的原则:
* 1.数组必须是有序数组;
* 2.找出当前序段的最大值和最下值,对应最大索引和最小索引,并计算出中间索引,将之间索引作为指针;
* 3.将给定的值与指针处的值进行比较,如果大于指针的值,说明,给定值处于较大范围内,此时,将指针处的索引+1作为最小索引,重新计算中间索引,并进行比较;
* 4.如果给定的值小于指针处的值,说明,给定值在较小范围内,将指针处的索引-1作为最大索引,然后重新计算中间索引,并进行比较。
* @param arr
*/
public int halfSelect(int[] arr,int target){
//初始化最大最小索引的值;
int minIndex = 0;
int maxIndex = arr.length-1;
while(true){
int middleIndex = (minIndex+maxIndex)/2;
if (arr[middleIndex] > target) {
maxIndex = middleIndex - 1;
}
if (arr[middleIndex] < target) {
minIndex = middleIndex + 1;
}
if (arr[middleIndex] == target) {
return middleIndex;
}
if (maxIndex < minIndex) {
return -1;
}
}
}
}
四、执行结果
[0, 2, 3, 3, 5, 8]
[0, 2, 3, 3, 5, 8]
2