博客
关于我
Java相关的基本算法
阅读量:338 次
发布时间:2019-03-04

本文共 3913 字,大约阅读时间需要 13 分钟。

执行效率从快到慢:快速、希尔、插入、选择、冒泡排序

1.数组逆序

实现思想:第一个递增,最后一个递减

//数组元素逆序public static void receive(int[] arr){   	for (int start = 0, end = arr.length-1; start < end; start++,end--) {   		int temp = arr[start];		arr[start] = arr[end];		arr[end] = temp;	}}
int[] arr = {   3, 4, 6, 1, 2, 7, 8, 5, 9};receive(arr);//输出结果:9,5,8,7,2,1,6,4,3

2.选择排序

实现思想:从左往右比较找到最小值,从左往右依次排放。

// 选择排序public static void select_sort(int[] arr) {      for (int i = 0; i < arr.length - 1; i++) {      	//选择排序的优化   	int k = i;   	for (int j = k + 1; j < arr.length - 1; j++) {      		// 找到最小值的下标   		if (arr[j] < arr[k]) {      			k = j;   		}   	}   	if (k != i) {      		int temp = arr[i];   		arr[i] = arr[k];   		arr[k] = temp;   	}   }}
int[] arr = {   3, 4, 6, 1, 2, 7, 8, 5, 9};select_sort(arr);//输出结果:1,2,3,4,5,6,7,8,9

深入了解:https://www.cnblogs.com/shen-hua/p/5424059.html

3.冒泡排序

实现思想:从头开始,依次相邻比较,把最大的放到最后边

//冒泡排序public static void bubbleSort(int[] arr) {   	//功能	//外层循环用来控制数组循环的圈数	for (int i = 0; i < arr.length-1; i++) {   		//j < arr.length-1 为了避免角标越界		//j < arr.length-1-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;			}		}	}}
int[] arr = {   3, 4, 6, 1, 2, 7, 8, 5, 9};bubbleSort(arr);//输出结果:1,2,3,4,5,6,7,8,9

4.普通查找

实现思想:遍历数组,查找相同的元素

//普通查找public static int getArrayIndex(int[] arr, int number) {   	//把数组中的元素依次与指定的数值 进行比较	for (int i = 0; i < arr.length; i++) {   		if (arr[i] == number) {   			//找到了			return i;		}	}	return -1;}
int[] arr = {   3, 4, 6, 1, 2, 7, 8, 5, 9};int arrayIndex = getArrayIndex(arr, 1);System.out.println(arrayIndex);//输出结果:3

5.二分法查找

实现思想:已知是排好序的数组,用中间元素和要查找的元素比较,大的话取左边

//二分查找法(折半查找法)public static int halfSearch(int[] arr, int number) {   	//定义3个变量,用来记录min, min, mid的位置        int min = 0;        int max = arr.length-1;        int mid = 0;        while (min <= max) {               mid = (min + max) / 2;            //没找到更新范围,继续比较            if (arr[mid] > number) {                   //在左边                max = mid - 1;            } else if (arr[mid] < number) {                   //在右边                min = mid + 1;            } else {                   return mid;            }        }        return -1;}
int[] arr = {   3, 4, 6, 1, 2, 7, 8, 5, 9};bubbleSort(arr);int arrayIndex = halfSearch(arr, 3);System.out.println(arrayIndex);//输出结果:2

https://www.cnblogs.com/kangyi/p/4262169.html

6.快排

实现思想:小的放前边,找一个index,放最小的索引,循环一轮得到一个最小值

public static void quickSort(int[] arr) {   	if (null == arr) {   		System.out.println("传入的数组为空!!!");	}	for (int i =0;i < arr.length;i++) {   		int index = i;		for (int j = i;j < arr.length;j++) {   			if (arr[index] > arr[j]) {   				index = j;			}		}		if (index != i) {   			int temp = arr[index];			arr[index] = arr[i];			arr[i] = temp;		}	}}
int[] arr = {   3, 4, 6, 1, 2, 7, 8, 5, 9};quickSort(arr);//输出结果:1,2,3,4,5,6,7,8,9

7.快速排序

实现思想:挖坑填数+分治法

思想:先取一个基数,下标从右向左找比基数小的,从左向右找比基数大的,找到和基数互换位置,然后进行下一轮操作,然后递归调用快排算法。

public static void quick_sort(int[] arr, int l, int r) {   	if (l < r) {   		// 确定数组下标的范围		int i = l, j = r;		// 先确定基准数		int flag = arr[l];		while (i < j) {   			// 下标j从右往左递减,找比基数小的数			while (i < j && flag < arr[j])				j--;			if (i < j) {   				// 找到填补基数坑				arr[i] = arr[j];				i++;			}			// 下标i从左往右递增,找比基数大的数			while (i < j && flag > arr[i])				i++;			if (i < j) {   				// 找到填补新坑				arr[j] = arr[i];				j--;			}		}		// 将原来的基准值放入中间数		arr[j] = flag;		// 递归调用		// 中间数的左边递归调用		quick_sort(arr, l, i - 1);		// 中间数的右边递归调用		quick_sort(arr, i + 1, r);	}}

8.递归算法

优点:

1.代码简洁
2.在树的遍历算法中,递归的实现比循环多
缺点:
1.由于是函数调用自身,时间和空间消耗比较大
2.递归中很多计算都是重复的,效率比较低
递归的优化:
使用动态规划:将可能出现的结果全部计算并保存,直到得到所需要的结果

int Fib(unsigned n){       if(n==1)return 1;    if(n==0)return 0;    return Fib(n-1)+Fib(n-2);}int Fib(unsigned n){       int* f=new int[n+1];    f[1]=1;f[0]=0;    for(int i=0;i<=n;i++);        f[i]=f[i-1]+f[i-2];      int r=f[n];    return r;}
你可能感兴趣的文章
NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
查看>>
NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
查看>>
NIFI分页获取Postgresql数据到Hbase中_实际操作---大数据之Nifi工作笔记0049
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
NIFI同步MySql数据源数据_到原始库hbase_同时对数据进行实时分析处理_同步到清洗库_实际操作06---大数据之Nifi工作笔记0046
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
查看>>
NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_处理器介绍_处理过程说明---大数据之Nifi工作笔记0019
查看>>
NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_实际操作---大数据之Nifi工作笔记0020
查看>>
NIFI大数据进阶_Json内容转换为Hive支持的文本格式_实际操作_02---大数据之Nifi工作笔记0032
查看>>
NIFI大数据进阶_Json内容转换为Hive支持的文本格式_操作方法说明_01_EvaluteJsonPath处理器---大数据之Nifi工作笔记0031
查看>>