首页 > 基础资料 博客日记

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进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云