java算法基础(一)

java算法基础(一)

排序算法之选择排序

选择排序是从数组中取出一个元素与其他元素挨个比较,符合条件则替换位置。

	public void selectionSort(int[] array){
		//如果数组长度为零或者为1都是不用排序的,直接返回
		if(array.length==0 || array.length == 1){
			return;
		}
		// 遍历数组
		for(int i=0,i<array.length-1,i++){
			int index= i;
			for(int j=0,j<array.length,j++){
				if(array[j]<array[i]){
					index = j;
				}
			}
			exch(array, i, index);
		}
	}
	
	 /**
     * 数组交换变量
     * @param array 数组
     * @param i     交换数据的下标
     * @param index 交换数据的下标
     */
	public void exch(int[] array,int i, int index){
		//判断两个下标是否一样,不一样执行交换
		if(index ^ i != 0){
			int swap = array[i];
			array[i] = array[index];
			array[index] = swap;
		}
	}

对数器

对数器就作用就是怎么快速的帮我们验证我们写的算法是否正确。
实现一个随机样本产生器,实现对比的方法。比较最终结果是否一致。就类似于压测一样的作用


	/**
     * 生成随机的样本数组
     *
     * @param maxSize  最大值
     * @param maxValue 最小值
     * @return 随机数组
     */
	public static int[] generateRandomSampleArray(int maxSize,int maxValue){
		//生成随机数范围为【0,maxSize】
		int arr = new int[(int) ((maxSize + 1) * Math.random()) ];
		//给数组赋值
		for(i=0;i<arr.length;i++){
			//产生【-maxValue,maxValue】
			arrt[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
		}
		return arr;
	}
	
	/**
     * 拷贝数组
     *
     * @param arr 被拷数组
     * @return 拷贝后数组
     */
	public int[] copyArray(int[] arr){
		if(arr == null) {
			return new int[0];
		}
		return Arrays.copyOf(arr, arr.length);
	}

    /**
     * 比较两个数组是否一致
     *
     * @param arr1 数组1
     * @param arr2 数组2
     * @return 布尔值
     */
	public static boolean isEqual(int[] arr1, int[] arr2) {
	//如果两个数组都为空返回true
	if(arr1 == null && arr2 == null){
		return true;
	}
	//两个数组中有一个为空,则为false,不一致
	if((arr1 != null && arr2 == null ) || (arr1 == null && arr2 != null) || (arr1.length != arr2 length)){
		return false;
	}
	
	for(int i=0, i<arr1.length;i++){
		if(arr1[i] != arr2[2]){
			return false;
		}
	}
	return true;
}

//对数器的用法

public static void main(String[] args) {
	 //定义数组的大小
	  int maxSize = 100;
      //数组的最大最小值
      int maxValue = 100;
      //定义一个标识
      boolean flag = true;
      //循环生成多次随机样本,进行比对
      for (int i = 0; i < maxSize; i++) {
      		//	生成样本数组
          int[] array = generateRandomArray(maxSize, maxValue);
          //拷贝样本数组,这个做的目的是在两个独立的内存空间进行比较
          int[] array1 = copyArray(array);
          //我们自己写的选择排序算法
          selectionSort(array);
          //这个java自带的排序算法,这个算法是一定对的
          Arrays.sort(array1);
          if (Boolean.FALSE.equals(isEqual(array1, array))) {
              flag = false;
              break;
          }
      }
      System.out.println(flag ? "Nice!" : "Fucking fucked!");
}

排序算法之冒泡排序

冒泡排序就是相邻的两个元素比较,直至最后一个。

	public static void bubbleSort(int[] array) {
        // 如果数组长度为0或者1,都是不用排序直接返回
        if (array.length == 0 || array.length == 1) {
            return;
        }
        for(int i = 0;i<array.length-1;i++){
			for(int j = i+1;j<array.length-i-1;j++){
				if(array[j] < array[i]){
					ercExch(array, i, j);
				}
			}
		}
	}
	
    /**
     * 用异或实现不加变量的赋值
     *
     * @param array 数组
     * @param i     交换数据的下标
     * @param index 交换数据的下标
     */
	public static void ercExch(int[] array,int i,int index ){
			array[i] = array[i] ^ array[index];
			array[index] = array[i] ^ array[index];
			array[i] = array[i] ^ array[index];
	}

对于异或的交换位置原理,相同为零
在这里插入图片描述

排序算法之插入排序

插入法排序原理
利用插入法对无序数组排序时,我们其实是将数组R划分成两个子区间R[1..i-1](已排好序的有序区)和R[i..n](当前未排序的部分,可称无序区)。插入排序的基本操作是将当前无序区的第1个记录R[i]插人到有序区R[1..i-1]中适当的位置上,使R[1..i]变为新的有序区。因为这种方法每次使有序区增加1个记录,通常称增量法。
插入排序与打扑克时整理手上的牌非常类似。摸来的第1张牌无须整理,此后每次从桌上的牌(无序区)中摸最上面的1张并插入左手的牌(有序区)中正确的位置上。为了找到这个正确的位置,须自左向右(或自右向左)将摸来的牌与左手中已有的牌逐一比较。

	//解法一:将获取这个元素于手上数组的元素挨个比较,一旦发现符合就进行交换
	public static void insertionSort(int[] array) {
		for(int i = 0;i<array.length;i++){
			for(int j = i;j < 0 ;j--){
				if(array[j]<array[j-1]){
					ercExch(array,j,j-1);
				}
			}
		} 
	}
	//	解法一对造成不必要的交换,导致浪费
	// 解法二 将获取的元素暂存起来,让手中元素与之比较,符合就将,元素往右移,不符合则将该获取的元素插入在该下标中
	 private static void insertionSort(int[] array) {
		for(int i = 0;i<array.length;i++){
			int temp = i;
			int j;
			for(j = i;j < 0 && temp <array[j-1];j--){
					array[j]=array[j-1];
			}
			array[j]=temp;
		} 
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值