c语言sscanf函数的用法是什么
274
2022-11-21
数据结构与算法-算法的魅力-一行代码性能提升千百不止
无意计算机底层原理及JVM底层后,就发现一行代码竟然会让系统性能提升一千倍不止。不是吹牛,本人亲测 优化后:唯一的区别就是将临时变量提取出来,如果是200w+数据,第一种方式需要很久很久很久才会出结果,而加了临时变量后,性能提升千倍不止; 原因分析:频繁的开辟新的空间导致JVM频繁的垃圾回收,导致运行效率下降 个人建议: 在开发中如果需要用到临时变量,最可能避免频繁的开辟大空间,销毁空间,这对系统性能提升有很大很大的帮助 接下来看下归并排序 优化前 package edu.sort; import java.util.Arrays; /** 归并排序 先对数据进行分段,分成一段段的连续的片段,然后采用插入排序进行 @author: LHT @date: 2020/12/14 15:24 */ public class MergeSort { public static void main(String[] args) { int[] data = {1, 4, 234, 63, 123, 56234, 21, 213, 4543}; mergeSort(data, 0, data.length - 1); System.out.print(Arrays.toString(data)); } public static void mergeSort(int data[], int left, int right) { if (left < right) { //拆分数组,如果想当,标示只有一个数了。不需要拆分了, int mid = (left + right) / 2; mergeSort(data, left, mid); mergeSort(data, mid + 1, right); //分完了接下来要合并 merge(data, left, mid, right); } } /** 合并数据 @param data 源数据 @param left 拆分左右边的下标 @param mid 拆分中间的下标 @param right 拆分有点的下标 */ public static void merge(int[] data, int left, int mid, int right) {int temp[] = new int[data.length]; //借用临时数组存储合并好的数据 int point1 = left;//标示最右边的第一个数据 int point2 = mid + 1;//标示右边的第一个数的位置 int loc = left; //标记我们当前已经到了那个位置 while (point1 <= mid && point2 <= right) { if (data[point1] < data[point2]) { temp[loc] = data[point1]; point1++; loc++; } else { temp[loc] = data[point2]; point2++; loc++; } } //合并数据 while (point1 <= mid) { temp[loc++] = data[point1++]; } while (point2 <= right) { temp[loc++] = data[point2++]; } //将排好序的数据,赋值给数组 for (int i = left; i <= right; i++) { data[i] = temp[i]; } } } package edu.sort; import java.util.Arrays; /** 归并排序 先对数据进行分段,分成一段段的连续的片段,然后采用插入排序进行 @author: LHT @date: 2020/12/14 15:24 */ public class MergeSort {public static int temp[]; public static void main(String[] args) { int[] data = {1, 4, 234, 63, 123, 56234, 21, 213, 4543}; mergeSort(data, 0, data.length - 1); System.out.print(Arrays.toString(data)); } public static void mergeSort(int data[], int left, int right) { if (left < right) { //拆分数组,如果想当,标示只有一个数了。不需要拆分了, int mid = (left + right) / 2; mergeSort(data, left, mid); mergeSort(data, mid + 1, right); //分完了接下来要合并 merge(data, left, mid, right); } } /** 合并数据 @param data 源数据 @param left 拆分左右边的下标 @param mid 拆分中间的下标 @param right 拆分有点的下标 */ public static void merge(int[] data, int left, int mid, int right) { temp = new int[data.length]; //借用临时数组存储合并好的数据 int point1 = left;//标示最右边的第一个数据 int point2 = mid + 1;//标示右边的第一个数的位置 int loc = left; //标记我们当前已经到了那个位置 while (point1 <= mid && point2 <= right) { if (data[point1] < data[point2]) { temp[loc] = data[point1]; point1++; loc++; } else { temp[loc] = data[point2]; point2++; loc++; } } //合并数据 while (point1 <= mid) { temp[loc++] = data[point1++]; } while (point2 <= right) { temp[loc++] = data[point2++]; } //将排好序的数据,赋值给数组 for (int i = left; i <= right; i++) { data[i] = temp[i]; } } }
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~