hi,你好!欢迎访问本站!登录
本站由网站地图腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 教程 - 后端开发 - 正文 君子好学,自强不息!

【后端开辟】java是算法吗?

2019-11-20后端开发搜奇网60°c
A+ A-

java不是算法。

Java是一门面向对象编程言语,是一种普遍运用的计算机编程言语,具有跨平台、面向对象、泛型编程的特征,普遍运用于企业级Web运用开辟和挪动运用开辟。

算法(Algorithm)是指解题计划的正确而完全的形貌,是一系列处理题目的清楚指令,算法代表着用体系的要领形貌处理题目的战略机制。也就是说,能够对肯定范例的输入,在有限时刻内取得所请求的输出。假如一个算法有缺点,或不适合于某个题目,实行这个算法将不会处理这个题目。差别的算法能够用差别的时刻、空间或效力来完成一样的使命。一个算法的好坏能够用空间复杂度与时刻复杂度来权衡。

我们能够运用java言语来完成差别的算法。

Java的几种罕见排序算法

1、冒泡排序

a、冒泡排序,是经由历程每一次遍历猎取最大/最小值

b、将最大值/最小值放在尾部/头部

c、然后除开最大值/最小值,剩下的数据在举行遍历猎取最大/最小值

d、代码完成

public static void main(String[] args) {

        int arr[] = {8, 5, 3, 2, 4};

        //冒泡
        for (int i = 0; i < arr.length; i++) {
            //外层轮回,遍历次数
            for (int j = 0; j < arr.length - i - 1; j++) {
                //内层轮回,升序(假如前一个值比后一个值大,则交流)
                //内层轮回一次,猎取一个最大值
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
    }

e、排序历程(赤色:挪动的数据)

5,3,2,4,8

3,2,4,5,8

2,3,4,5,8

2,3,4,5,8

2,3,4,5,8

2、挑选排序

a、将第一个值算作最小值

b、然后和后续的比较找出最小值和下标

c、交流本次遍历的肇端值和最小值

d、申明:每次遍历的时刻,将前面找出的最小值,算作一个有序的列表,背面的算作无序的列表,然后每次遍历无序列表找出最小值。

e、代码完成

public static void main(String[] args) {

        int arr[] = {6, 5, 3, 2, 4};

        //挑选
        for (int i = 0; i < arr.length; i++) {
            //默许第一个是最小的。
            int min = arr[i];
            //纪录最小的下标
            int index = i;
            //经由历程与背面的数据举行比较得出,最小值和下标
            for (int j = i + 1; j < arr.length; j++) {
                if (min > arr[j]) {
                    min = arr[j];
                    index = j;
                }
            }
            //然后将最小值与本次轮回的,最先值交流
            int temp = arr[i];
            arr[i] = min;
            arr[index] = temp;
            //申明:将i前面的数据算作一个排好的行列,i背面的算作一个无序行列。每次只需要找无需的最小值,做替代
        }
    }

f、排序历程(赤色:挪动的数据)

2,5,3,6,4

2,3,5,6,4

2,3,4,6,5

2,3,4,5,6

2,3,4,5,6

3、插进去排序

a、默许从第二个数据最先比较。

b、假如第二个数据比第一个小,则交流。然后在用第三个数据比较,假如比前面小,则插进去(桀黠)。不然,退出轮回

c、申明:默许将第一数据算作有序列表,背面无序的列表轮回每一个数据,假如比前面的数据小则插进去(交流)。不然退出。

d、代码完成

public static void main(String[] args) {

        int arr[] = {7, 5, 3, 2, 4};

        //插进去排序
        for (int i = 1; i < arr.length; i++) {
            //外层轮回,从第二个最先比较
            for (int j = i; j > 0; j--) {
                //内存轮回,与前面排好序的数据比较,假如背面的数据小于前面的则交流
                if (arr[j] < arr[j - 1]) {
                    int temp = arr[j - 1];
                    arr[j - 1] = arr[j];
                    arr[j] = temp;
                } else {
                    //假如不小于,申明插进去终了,退出内层轮回
                    break;
                }
            }
        }
    }

e、排序历程(赤色:有序,黑色:无序)

5,7,3,2,4

3,5,7,2,4

2,3,5,7,4

2,3,4,5,7

4、希尔排序(插进去排序变种版)

a、基本上和插进去排序一样的原理

b、不一样的处所在于,每次轮回的步长,经由历程减半的体式格局来完成

c、申明:基本原理和插进去排序相似,不一样的处所在于。经由历程距离多个数据来举行插进去排序。

d、代码完成

public static void main(String[] args) {

        int arr[] = {7, 5, 3, 2, 4};

        //希尔排序(插进去排序变种版)
        for (int i = arr.length / 2; i > 0; i /= 2) {
            //i层轮回掌握步长
            for (int j = i; j < arr.length; j++) {
                //j掌握无序端的肇端位置
                for (int k = j; k > 0  && k - i >= 0; k -= i) {
                    if (arr[k] < arr[k - i]) {
                        int temp = arr[k - i];
                        arr[k - i] = arr[k];
                        arr[k] = temp;
                    } else {
                        break;
                    }
                }
            }
            //j,k为插进去排序,不过步长为i
        }
    }

e、排序历程(步长4/2/1)

4,1,3,2,6,5,8,9,7

3,1,4,2,6,5,7,9,8

1,2,3,4,5,6,7,8,9

5、疾速排序

a、确认列表第一个数据为中心值,第一个值算作空白(低指针空白)。

b、然后在剩下的行列中,算作有摆布两个指针(上下)。

c、最先高指针向左挪动,假如碰到小于中心值的数据,则将这个数据赋值到低指针空白,而且将高指针的数据算作空白值(高指针空白)。然后先向右挪动一下低指针,而且切换低指针挪动。

d、当低指针挪动到大于中心值的时刻,赋值到高指针空白的处所。然后先高指针向左挪动,而且切换高指针挪动。反复c、d操纵。

e、直到高指针和低指针相称时退出,而且将中心值赋值给对应指针位置。

f、然后将中心值的摆布双方算作行的列表,举行疾速排序操纵。

g、代码完成

public static void main(String[] args) {

        int arr[] = {7, 5, 3, 2, 4, 1, 8, 9, 6};

        //疾速排序
        int low = 0;
        int high = arr.length - 1;
        quickSort(arr, low, high);  
    }

    public static void quickSort(int[] arr, int low, int high) {
        //假如指针在统一位置(只要一个数据时),退出
        if (high - low < 1) {
            return;
        }
        //标记,从高指针最先,照样低指针(默许高指针)
        boolean flag = true;
        //纪录指针的实在位置
        int start = low;
        int end = high;
        //默许中心值为低指针的第一个值
        int midValue = arr[low];
        while (true) {
            //高指针挪动
            if (flag) {
                //假如列表右方的数据大于中心值,则向左挪动
                if (arr[high] > midValue) {
                    high--;
                } else if (arr[high] < midValue) {
                    //假如小于,则掩盖最最先的低指针值,而且挪动低指针,标志位改成从低指针最先挪动
                    arr[low] = arr[high];
                    low++;
                    flag = false;
                }
            } else {
                //假如低指针数据小于中心值,则低指针向右挪动
                if (arr[low] < midValue) {
                    low++;
                } else if (arr[low] > midValue) {
                    //假如低指针的值大于中心值,则掩盖高指针停止时的数据,并向左挪动高指针。切换为高指针挪动
                    arr[high] = arr[low];
                    high--;
                    flag = true;
                }
            }
            //当两个指针的位置相同时,则找到了中心值的位置,并退出轮回
            if (low == high) {
                arr[low] = midValue;
                break;
            }
        }
        //然后涌现有,中心值左侧的小于中心值。右侧的大于中心值。
        //然后在对摆布双方的列表在举行疾速排序
        quickSort(arr, start, low -1);
        quickSort(arr, low + 1, end);
    }

h、排序历程

6,5,3,2,4,1,7,9,8

1,5,3,2,4,6,7,9,8

1,5,3,2,4,6,7,9,8

1,4,3,2,5,6,7,9,8

1,2,3,4,5,6,7,9,8

1,2,3,4,5,6,7,9,8

1,2,3,4,5,6,7,8,9

6、兼并排序

a、将列表根据对等的体式格局举行拆分

b、拆分小最小快的时刻,在将最小块根据本来的拆分,举行兼并

c、兼并的时刻,经由历程摆布两块的左侧最先比较大小。小的数据放入新的块中

d、申明:简朴一点就是先对半拆成最小单元,然后将两半数据兼并成一个有序的列表。

e、代码完成

public static void main(String[] args) {

        int arr[] = {7, 5, 3, 2, 4, 1,6};

        //兼并排序
        int start = 0;
        int end = arr.length - 1;
        mergeSort(arr, start, end);
    }

    public static void mergeSort(int[] arr, int start, int end) {
        //推断拆分的不为最小单元
        if (end - start > 0) {
            //再一次拆分,晓得拆成一个一个的数据
            mergeSort(arr, start, (start + end) / 2);
            mergeSort(arr, (start + end) / 2 + 1, end);
            //纪录最先/完毕位置
            int left = start;
            int right = (start + end) / 2 + 1;
            //纪录每一个小单元的排序效果
            int index = 0;
            int[] result = new int[end - start + 1];
            //假如查分后的两块数据,都还存在
            while (left <= (start + end) / 2 && right <= end) {
                //比较两块数据的大小,然后赋值,而且挪动下标
                if (arr[left] <= arr[right]) {
                    result[index] = arr[left];
                    left++;
                } else {
                    result[index] = arr[right];
                    right++;
                }
                //挪动单元纪录的下标
                index++;
            }
            //当某一块数据不存在了时
            while (left <= (start + end) / 2 || right <= end) {
                //直接赋值到纪录下标
                if (left <= (start + end) / 2) {
                    result[index] = arr[left];
                    left++;
                } else {
                    result[index] = arr[right];
                    right++;
                }
                index++;
            }
            //末了将新的数据赋值给本来的列表,而且是对应分块后的下标。
            for (int i = start; i <= end; i++) {
                arr[i] = result[i - start];
            }
        }
    }

f、排序历程

5,7,3,2,4,1,6

5,7,2,3,4,1,6

2,3,5,7,4,1,6

2,3,5,7,1,4,6

2,3,5,7,1,4,6

1,2,3,4,5,6,7

引荐教程:Java教程

以上就是java是算法吗?的细致内容,更多请关注ki4网别的相干文章!

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  移步手机端
【后端开辟】java是算法吗?

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
标签:

本文来源:搜奇网

本文地址:https://www.sou7.cn/282544.html

关注我们:微信搜索“搜奇网”添加我为好友

版权声明: 本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。请记住本站网址https://www.sou7.cn/搜奇网。

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>