选择排序、冒泡排序、二分查找

一、闲的无聊,写了个这么玩意,锻炼一下自己的逻辑思维。

二、总觉得有时候死记硬背不是好办法,所以讲自己的思路也写上了。

三、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




猜你喜欢

转载自blog.csdn.net/luojishan1/article/details/79440779