随学随更,方便复习

选择排序:

package one;/*** @author 新时代好少年* @create 2022-07-08 8:02* 选择排序:时间复杂度O(n^2)  空间复杂度O(1)*/
public class SelectorSort {public static void selectionSort(int[] arr){if(arr == null || arr.length < 2){return ;}for (int i = 0; i < arr.length; i++) {int minIndex = i;for (int j = i + 1; j < arr.length; j++) {minIndex = arr[j] < arr[minIndex] ? j: minIndex;//i ~ N-1 找出最小值的下标}swap(arr,i,minIndex);}}public static void swap(int[] arr,int i ,int j){int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}public static void main(String[] args) {int[] arr = {1,5,3,9,2,4,1,7};selectionSort(arr);for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}}

冒泡排序:

package one;/*** @author 新时代好少年* @create 2022-07-08 8:22* 冒泡排序:时间复杂度O(n^2)  空间复杂度O(1)*/
public class BubbleSort {public static void  bubblesort(int[] arr){if (arr == null || arr.length < 2){return;}//0~N 0~N-1 0~N-2 ...for (int i = arr.length -1 ; i > 0 ; i--) { //i = arr.length -1for (int j = 0; j < i; j++) { // j = 0; j < iif(arr[j] > arr[j+1]){swap(arr,j,j+1);}}}}public static void swap(int[] arr,int i ,int j){int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}public static void main(String[] args) {int[] arr = {1,5,3,9,2,4,1,7};bubblesort(arr);for (int i = 0; i < arr.length; i++) { //i < arr.lengthSystem.out.print(arr[i] + " ");}}}

插入排序(对数器:)

package one;import java.lang.reflect.Array;
import java.util.Arrays;/*** @author 新时代好少年* @create 2022-07-08 8:46* 插入排序 时间复杂度O(n^2) 但是常数项比前两个更优  空间复杂度O(1)*/
public class InsertionSort {public static void insertionsert(int[] arr){if (arr == null || arr.length < 2){return;}for (int i = 1; i < arr.length; i++) {for (int j = i-1 ;j >= 0 && arr[j] > arr[j+1] ; j--) {swap(arr,j,(j+1));}}}public static void swap(int[] arr, int i , int j){int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}//官方给的排序public static void comparator(int[] arr){Arrays.sort(arr);}//随机生成一组数组public static int[] generateRandomArray(int maxSize,int maxValue){int[] arr = new int[(int) (Math.random() * (maxSize + 1))];for (int i = 0; i < arr.length; i++) {arr[i] = (int)( (Math.random()*(maxValue+1)) -(int)(Math.random()*maxValue));}return arr;}//复制数组public static int[] copyArray(int[] arr){if(arr == null){return null;}int[] res = new int[arr.length];for (int i = 0; i < arr.length; i++) {res[i] = arr[i];}return res;}//判断相等public static boolean isEqual(int[] arr1 ,int[] arr2){for (int i = 0; i < arr1.length; i++) {if(arr1[i] != arr2[i]){return false;}break;}return true;}//输出数组public static void printArray(int[] arr){for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}public static void main(String[] args) {//对数器int testTime = 500000;//测试次数int maxSize = 100;//数组长度范围int maxValue = 100;//数组值范围boolean success = true;for (int i = 0; i < testTime; i++) {int[] arr1 = generateRandomArray(maxSize,maxValue);//长度、值都随机int[] arr2 = copyArray(arr1);insertionsert(arr1);comparator(arr2);if(!isEqual(arr1,arr2)){success = false;printArray(arr1);printArray(arr2);break;}}System.out.println(success?"NICE!!!":"Fucking fucked!");int[] arr1 = generateRandomArray(maxSize,maxValue);System.out.println("随机生成的数组:");printArray(arr1);insertionsert(arr1);System.out.println();System.out.println("排序后:");printArray(arr1);}
}

异或运算:

package one;/*** @author 新时代好少年* @create 2022-07-08 9:27* 异或运算*/
public class EvenTimeOddTimes {//一组数组,只有一个数字出现奇数次,其余的数都出现偶数次,找出这一个数public static void printOddTimes1(int[] arr){int eor = 0; //任何数跟0异或都是他本身for(int cur :arr){eor ^= cur; //每个数异或一遍,得到的结果就是单数}System.out.println(eor);}//一组数组,有两个数出现了奇数次,其余都出现偶数次,找出这两个数,假设这两个数是a,bpublic static void printOddTimes2(int[] arr){int eor = 0;for(int cur : arr){eor ^= cur;  //得到eor = a^b}int rightOne = eor & (~eor + 1); //提取出最右侧的1int onlyOne = 0;//eor'for (int cur : arr){if((cur & rightOne) != 0 ){onlyOne ^= cur; //得到a或者b}}System.out.println(onlyOne + "和" + (eor ^ onlyOne)); //eor = a^b ,onlyOne = a, eor^onlyOne=a^b^a=b}public static void main(String[] args) {int[] arr1 = {1,2,2,1,1,2,2,3,4,4,4,4,1};printOddTimes1(arr1);int[] arr2 = {1,2,2,1,1,2,2,3,4,4,4,4,1,1};printOddTimes2(arr2);}
}

递归获取数组最大值:

package one;/*** @author 新时代好少年* @create 2022-07-08 11:10* 利用递归找最大值* 分析递归的时候,把递归的决策树都画出来,就能明白* 满足Master公式 时间复杂度O(n)*/
public class GetMax {public static int getMax(int[] arr){if (arr == null || arr.length == 0){throw new RuntimeException();}return process(arr,0, arr.length-1);}public static int process(int[] arr,int L ,int R){if(L == R){return arr[L];}int mid = L + ((R - L)>>1);int rightMax = process(arr,mid + 1, R);int leftMax = process(arr,L,mid);return Math.max(rightMax,leftMax);}public static void main(String[] args) {int[] arr = {1,4,5,8,3,6,9};System.out.println(getMax(arr));}
}

归并排序:

package two;import java.util.Arrays;/*** @author 新时代好少年* @create 2022-07-09 13:05* 归并排序:时间复杂度O(nlogn) 空间复杂度O(n)*      先利用递归将数组一分为二并且排好序*      再依次对比进行排序*/
public class MergeSort {public static void mergeSort(int[] arr){if(arr == null || arr.length <2){return;}process(arr,0, arr.length-1);}public static void process(int[] arr,int l ,int r ){if(l == r){return; //递归结束的标志}int mid = l + ((r - l)>>1);process(arr,l,mid);process(arr,mid+1,r);merge(arr,mid,l,r);}public static void merge(int[] arr,int mid,int l,int r){//创建一个新的函数int[] helpArr = new int[r-l+1];int i = 0;int p1 = l;int p2 = mid+1;while (p1 <= mid && p2 <= r){helpArr[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++];}//两组数组中有一个数组对比完,剩下的数组直接依次加入helpArr即可while (p1 <= mid){helpArr[i++] = arr[p1++];}while (p2 <= r){helpArr[i++] = arr[p2++];}//把helpArr的数组抄进arr里for (int j = 0; j < helpArr.length; j++) {arr[l + j] = helpArr[j];}}//官方给的排序public static void comparator(int[] arr){Arrays.sort(arr);}//随机生成一组数组public static int[] generateRandomArray(int maxSize,int maxValue){int[] arr = new int[(int) (Math.random() * (maxSize + 1))];for (int i = 0; i < arr.length; i++) {arr[i] = (int)( (Math.random()*(maxValue+1)) -(int)(Math.random()*maxValue));}return arr;}//复制数组public static int[] copyArray(int[] arr){if(arr == null){return null;}int[] res = new int[arr.length];for (int i = 0; i < arr.length; i++) {res[i] = arr[i];}return res;}//判断相等public static boolean isEqual(int[] arr1 ,int[] arr2){for (int i = 0; i < arr1.length; i++) {if(arr1[i] != arr2[i]){return false;}break;}return true;}//输出数组public static void printArray(int[] arr){for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}public static void main(String[] args) {//对数器int testTime = 500000;//测试次数int maxSize = 100;//数组长度范围int maxValue = 100;//数组值范围boolean success = true;for (int i = 0; i < testTime; i++) {int[] arr1 = generateRandomArray(maxSize,maxValue);//长度、值都随机int[] arr2 = copyArray(arr1);mergeSort(arr1);comparator(arr2);if(!isEqual(arr1,arr2)){success = false;printArray(arr1);printArray(arr2);break;}}System.out.println(success?"NICE!!! 排序成功!!!":"Fucking fucked!");int[] arr1 = generateRandomArray(maxSize,maxValue);System.out.println("随机生成的数组:");printArray(arr1);mergeSort(arr1);System.out.println();System.out.println("排序后:");printArray(arr1);}}

求小和问题(归并排序):

package two;/*** @author 新时代好少年* @create 2022-07-09 14:26* 求小和问题: 利用归并排序  将数组中其小于右边的数组进行累加求和*          ex: [1,3,4,2,5]  smallSum = 1+1+3+1+1+3+4+2 =16*/
public class SmallSum {public static int smallSun(int[] arr){if(arr == null || arr.length < 2){return 0;}return process(arr,0,arr.length -1);}public static int process(int[] arr ,int l,int r){if(l == r){return 0;}int mid = l + ((r-l)>>1);return process(arr,l,mid) //左侧排序并求小和+ process(arr,mid + 1,r) //右侧排序并求小和+ merge(arr,mid,l,r); //左组、右组合并并求小和}public static int merge(int[] arr ,int m ,int l ,int r){int[] newArr = new int[r-l+1];int i = 0;int p1 = l;int p2 = m+1;int res = 0;while (p1 <= m && p2 <= r){res += arr[p1] < arr[p2] ? (r-p2+1)*arr[p1] : 0; //(r-p2+1)*arr[p1] 就是左边有几个比他大的数就乘以几newArr[i++] = arr[p1] < arr[p2] ? arr[p1++]:arr[p2++];}return res;}public static void main(String[] args) {int[] arr = {1,3,4,2,5};System.out.println(smallSun(arr));}
}

堆排序:

package two;import java.util.Arrays;/*** @author 新时代好少年* @create 2022-07-09 16:02* 堆  对其实是用数组实现的* 堆排序  时间复杂度O(nlogn)*/
public class HeapSort {public static void heapSort(int[] arr){if(arr == null || arr.length < 2){return;}
//        for (int i = 0; i < arr.length; i++) {//将数组变成大根堆
//            heapInsert(arr,i);
//        }for (int i = arr.length -1 ; i >= 0 ; i--) {//将数组变成大根堆heapfiy(arr,i,arr.length);}int heapSize = arr.length;//数组有效长度swap(arr,0,--heapSize);while (heapSize > 0){heapfiy(arr,0,heapSize);swap(arr,0,--heapSize);}}//在大根堆尾插入一个数,重新排列,使得堆依旧保持大根堆的样子(插入)public static void heapInsert(int[] arr,int index){while(arr[index] > arr[(index -1)/2] ){swap(arr ,index,(index-1)/2);index = (index -1)/2;}}//将堆中最大值删除,使得新的堆保持大根堆结构(删除)
//        不断跟自己的左右孩子比较,孩子大于父,则父往下沉,孩子上来public static void heapfiy(int[] arr ,int index,int heapSize){int left = index*2 +1;// 左孩子while(left < heapSize){ //heapSize数组有效长度int largest =           //left+1 < heapSize 表示存在右孩子   此时:largest是左右孩子中的最大值的下标left+1 < heapSize && arr[left+1] > arr[left] ?left+1:left;largest = arr[largest]>arr[index] ? largest : index; //largest跟父亲比较if(largest == index){  //循环终止条件:最大值就是父亲的时候break;}swap(arr,largest,index); //将最大值(也就是父的左右孩子中的一个)跟父节点的 值 交换index = largest;    //父节点来到下方left = index*2 +1;  //重新找到自己新的孩子}}public static void swap(int[] arr,int i ,int j){int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}//官方给的排序public static void comparator(int[] arr){Arrays.sort(arr);}//随机生成一组数组public static int[] generateRandomArray(int maxSize,int maxValue){int[] arr = new int[(int) (Math.random() * (maxSize + 1))];for (int i = 0; i < arr.length; i++) {arr[i] = (int)( (Math.random()*(maxValue+1)) -(int)(Math.random()*maxValue));}return arr;}//复制数组public static int[] copyArray(int[] arr){if(arr == null){return null;}int[] res = new int[arr.length];for (int i = 0; i < arr.length; i++) {res[i] = arr[i];}return res;}//判断相等public static boolean isEqual(int[] arr1 ,int[] arr2){for (int i = 0; i < arr1.length; i++) {if(arr1[i] != arr2[i]){return false;}break;}return true;}//输出数组public static void printArray(int[] arr){for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}public static void main(String[] args) {//对数器int testTime = 500000;//测试次数int maxSize = 100;//数组长度范围int maxValue = 100;//数组值范围boolean success = true;for (int i = 0; i < testTime; i++) {int[] arr1 = generateRandomArray(maxSize,maxValue);//长度、值都随机int[] arr2 = copyArray(arr1);heapSort(arr1);comparator(arr2);if(!isEqual(arr1,arr2)){success = false;printArray(arr1);printArray(arr2);break;}}System.out.println(success?"NICE!!! 排序成功!!!":"Fucking fucked!");int[] arr1 = generateRandomArray(maxSize,maxValue);System.out.println("随机生成的数组:");printArray(arr1);heapSort(arr1);System.out.println();System.out.println("排序后:");printArray(arr1);}}

荷兰国旗问题:

package two;/*** @author 新时代好少年* @create 2022-07-09 18:55* 荷兰国旗问题:设一个数字,将数组划分成三份:小于该数字的区域、等于该数字的区域、大于该数字的区域*/
public class NetherlandsFlag {public static int[] partition(int[] arr,int L ,int R,int p){//e为作为划分的这个数字int less = L - 1;//左右边界,起初在最边上int more = R + 1;int index = L;//当前指针指向arr[0]位置while (index < more){if(arr[index] < p){swap(arr,++less,index++);//小于,换完向后跳index++}else if(arr[index] > p){swap(arr,--more,index);//注意,大于的时候,换完位置不跳!index}else {index++;}}return new int[] {less + 1,more -1};}public static void swap(int[] arr,int i ,int j){int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}public static void main(String[] args) {int[] arr = {1,3,4,5,5,7,6,1};int[] result = partition(arr,1,5,5);
//        System.out.println(result);   //会报[I@1b6d3586,出现的原因:是因为直接输出的是数组,解决办法就是将数组元素输出,不输出整个数组for (int i = 0; i < result.length; i++) {System.out.print(result[i] + " ");}}
}

快速排序:

package two;import java.util.Arrays;/*** @author 新时代好少年* @create 2022-07-09 19:49* 快速排序*/
public class QuickSort {public static void quickSort(int[] arr){if(arr == null || arr.length <2){return;}process(arr,0,arr.length-1);}public static void process(int[] arr,int l,int r){if(l < r){swap(arr,l+(int)(Math.random()*(r-l+1)) ,r);int[] p = partition(arr,l,r);process(arr,l,p[0]-1);process(arr,p[1]+1,r);}}public static int[] partition(int[] arr, int l,int r){int less = l-1;int more = r;while(l < more){if(arr[l] < arr[r]){swap(arr,++less,l++);}else if(arr[l] > arr[r]){swap(arr,--more,l);}else {l++;}}swap(arr,more,r);return new int[]{less + 1,more};}public static void swap(int[] arr,int i ,int j){int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}//官方给的排序public static void comparator(int[] arr){Arrays.sort(arr);}//随机生成一组数组public static int[] generateRandomArray(int maxSize,int maxValue){int[] arr = new int[(int) (Math.random() * (maxSize + 1))];for (int i = 0; i < arr.length; i++) {arr[i] = (int)( (Math.random()*(maxValue+1)) -(int)(Math.random()*maxValue));}return arr;}//复制数组public static int[] copyArray(int[] arr){if(arr == null){return null;}int[] res = new int[arr.length];for (int i = 0; i < arr.length; i++) {res[i] = arr[i];}return res;}//判断相等public static boolean isEqual(int[] arr1 ,int[] arr2){for (int i = 0; i < arr1.length; i++) {if(arr1[i] != arr2[i]){return false;}break;}return true;}//输出数组public static void printArray(int[] arr){for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}public static void main(String[] args) {//对数器int testTime = 500000;//测试次数int maxSize = 100;//数组长度范围int maxValue = 100;//数组值范围boolean success = true;for (int i = 0; i < testTime; i++) {int[] arr1 = generateRandomArray(maxSize,maxValue);//长度、值都随机int[] arr2 = copyArray(arr1);quickSort(arr1);comparator(arr2);if(!isEqual(arr1,arr2)){success = false;printArray(arr1);printArray(arr2);break;}}System.out.println(success?"NICE!!!":"Fucking fucked!");int[] arr1 = generateRandomArray(maxSize,maxValue);System.out.println("随机生成的数组:");printArray(arr1);quickSort(arr1);System.out.println();System.out.println("排序后:");printArray(arr1);}}

随学随更

【Java】——基础算法Java代码相关推荐

  1. java基础之----java常见异常及代码示例

    java基础之----java常见异常及代码示例 参考文章: (1)java基础之----java常见异常及代码示例 (2)https://www.cnblogs.com/gunduzi/p/1203 ...

  2. java代码规范插件_「Java基础知识」代码规范插件怎么用

    原标题:「Java基础知识」代码规范插件怎么用 在开发中,好的编程风格可以提升团队合作能力,提升开发的效率,但是每个人都有自己的编程习惯,如何能够将大家的编程风格统一,这个在团队中也很重要; 在Jav ...

  3. Java冒泡算法和代码详述

    Java冒泡算法和代码详述 冒泡排序算法是Java排序算法中最基本,也是最有名的算法之一 代码分为两层循环,外层冒泡轮数,里层依次比较 代码说明: package arrays;import java ...

  4. 黑马程序员:Java基础总结----Java语言编程规范

       黑马程序员:Java基础总结        Java语言编程规范:参考自SUN公司文档  ASP.Net+Android+IO开发..Net培训.期待与您交流!  I.   排版规范 A.  规 ...

  5. Java基础:Java抽象接口

    在Java中,一个没有方法体的方法应该定义为抽象方法,而如果一个类中含有抽象方法,则该类必须定义为一个抽象类.接口是功能的集合,同样可看做是一种特殊的数据类型,是比抽象类更为抽象的类,接口只描述所应该 ...

  6. java基础之java中的基本数据类型

    java基础之java中的基本数据类型 学习java一段时间了,使用java也差不多一年多了,可是对于后续的java的学习真的是后劲不足,或者是说懒惰吧,回想一下这一年多,用java最多的就是Andr ...

  7. java基础总结-java技术栈快速复习

    java基础 java基础概念 java概述和语言背景 java语言是没有sun公司(Stanford University Network:斯坦福大学网络)在1995年推出的计算机语言 java之父 ...

  8. 【Java基础】· Java基本语法:程序流程控制习题总结

    写在前面 Hello大家好, 我是[麟-小白],一位软件工程专业的学生,喜好计算机知识.希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正!谢谢大家!!! ...

  9. Java 基础学习-Java语言概述

    Java 基础学习 第一章 Java语言概述 回顾java基础知识,进行整理记录. 文章目录 Java 基础学习 前言 一. Java语言发展史(了解) 二.Java语言跨平台原理(理解) 三.JRE ...

  10. JAVA基础之java语法

    JAVA基础之java语法 第一个java程序 // HelloWorld类名和文件名相同 public class HelloWorld {// 公开的 static 静态的 void 没有返回值 ...

最新文章

  1. C语言判断是否为happy number快乐数字的算法(附完整源码)
  2. 隐马尔科夫模型C#语言算法实现
  3. java list 占用内存不释放_性能不打折,内存占用减少90%,Facebook提出极致模型压缩方法Quant-Noise...
  4. java webservice 身份验证_java-Http基本身份验证不适用于Spring WS和WebS...
  5. JS 实现 jQuery的$(function(){});
  6. (38)FPGA三种基本逻辑门(或门)
  7. 问题:自定义Appender输出DCMTK的oflog
  8. 开源操作系统 OpenBSD 被曝四个严重的认证绕过和提权漏洞(详情)
  9. CSDN,我!王睿,回来了!!!
  10. 高等代数期末考试题库及答案_高等代数II答案试题题目及答案,期末考试题库,章节测验答案...
  11. 搭建局域网Web服务器
  12. 计算机专业学生的学期规划,大学生大一下学期规划
  13. 椭圆曲线算法和国密SM2算法介绍
  14. HC-05蓝牙模块连接蓝牙打印机步骤
  15. 新概念英语第四册16-30课(转)
  16. 1455:【例题1】Oulipo——字符串哈希
  17. 一度智信|拼多多优惠券怎么取消
  18. 王者荣耀苹果游客服务器信号,王者荣耀游客号怎么转移 苹果游客号怎么转移到微信...
  19. 怎样查找Xilinx的资料
  20. 个人智库服务的建立与选型

热门文章

  1. linux 中添加kvm虚拟化,一文告诉你Linux如何配置KVM虚拟化--安装篇
  2. 网站推广的十种方式(初级篇)!
  3. 这四款良心好用的优质软件,我用了多年,百用不腻
  4. 喷淋塔废水除臭剂降低排放口废气浓度
  5. 苹果索要30%分成:iPad新媒体焦虑控制权
  6. Ext JS4序列教程之一 :Layout布局
  7. Bilibili 网页版下载视频 B站下载MP4格式视频(不用下载工具)
  8. excel自动筛选_自动更改Excel筛选器标题
  9. 屏幕录制:SCR Screen Recorder Pro v0.14.3汉化破解版
  10. kml文件是怎么来的?Google Maps前传:在被Google收购之前,它是如何发展起来的