首页 > 基础资料 博客日记
java写算法的注意事项
2023-07-24 17:18:20基础资料围观198次
这篇文章介绍了java写算法的注意事项,分享给大家做个参考,收藏Java资料网收获更多编程知识
java写算法的注意事项 -- 关于输入输出
java类在执行简单的操作时速度会很快,一旦类下有很多子类时(不简单的操作),花费的时间就会很多,Scanner就是这个例子。
Scanner的花费时间相比较其他java的快读写法 差距在10倍左右
这里推荐几种快读方法:
第一种 StreamTokenizer
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
st.ordinaryChar('\'');
st.nextToken(); //读取标记
int i = (int)st.nval; //分析标记
st.nextToken(); //读取下一个标记
String s = st.sval;
System.out.println(s+i);
}
}
//用于统计文件中的字符数 标点符号在普通状态下无法读入,不推荐使用
第二种StringTokenizer
//是字符串分割解析类型,输入一个字符串,对其进行拆解
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
StringTokenizer st;
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
//默认情况下只对空格、回车、制表符作为拆分点,这里添加了 / ,true表示将 / 进行输出
st = new StringTokenizer(bf.readLine(),"/",true);
int i = Integer.parseInt(st.nextToken()); //读取标记
String s = st.nextToken();
PrintWriter out=new PrintWriter(System.out);
out.print(i); // 相当于System.out.print
out.flush();
}
}
第三种BufferedReader
//我最常用的,比较简单,输入速度也很快
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
//这里输入一串由空格分隔的数字为例子:5 5 5 53 45
//通常都是string数组接收
String[] s = bf.readLine().split(" ");
int[] a = new int[100];
int i;
for(i = 0; i < s.length;i++){
a[i] = Integer.parseInt(s[i]);
}
//输出
PrintWriter pw = new PrintWriter(System.out);
for(int j = 0; j < i; j++){
pw.print(a[j]);
}
pw.flush();
}
}
--关于java排序算法Arrays.sort
arrays.sort对基本类型使用了 快速排序,对对象类型使用了优化的归并排序
排序主要在于比较和交换,快排比较的次数较多,归并交换的次数较多
对于对象来说,比较比移动耗时,因此选择归并
归并排序例子:
public static void merge_sort(int[] arr){
int[] result = new int[arr.length];
merge_current_sort(arr,result,0,arr.length-1);
for(int i = 0; i < arr.length; i++){
System.out.println(result[i]);
}
}
public static void merge_current_sort(int[] arr, int[] result, int start, int end){
if(start >= end){
return ;
}
int mid = start + (end-start)/2;
int start1 = start,end1 = mid;
int start2 = mid+1,end2 = end;
merge_current_sort(arr,result,start1,end1);
merge_current_sort(arr,result,start2,end2);
int k = start1;
while(start1 <= end1 && start2 <= end2){
result[k++] = arr[start1] > arr[start2] ? arr[start1++] : arr[start2++];
}
while (start1 <= end1){
result[k++] = arr[start1++];
}
while (start2 <= end2){
result[k++] = arr[start2++];
}
for(k = start; k <= end; k++){
arr[k] = result[k];
}
}
快速排序例子:
//快速排序的改进可以在 迭代排序减少内存占用率,对于较小的序列使用插入排序,还可以将排序部分分为三段,分别采用不同的排序(双轴快排)
static int[] quick= new int[]{2,5,6,4,8,3,9,7,5,3};
public static void swap(int a, int b){
int temp = quick[a];
quick[a] = quick[b];
quick[b] = temp;
}
public static void quick_sort(int start,int end){
if(start >= end)return;
int mid = quick[end];
int left = start,right = end-1;
while(left < right){
while(quick[left] <= mid && left < right){
left++;
}
while (quick[right] >= mid && right > left){
right--;
}
swap(left,right);
}
if(quick[left] >= quick[end])
swap(left,end);
else
left++;
quick_sort(start,left-1);
quick_sort(left+1,end);
}
因此在运用java Arrays.sort方法时,注意快速排序的不稳定性,最坏复杂度是O(n^2),容易超时,使用对象可以较好的解决问题
文章来源:https://www.cnblogs.com/ioname/p/16492106.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签: