java基础-排序算法

1、冒泡排序

复制代码
package com.jdL.day21classwork;

public class BubbleSort {
    public static void main(String[] args) {
        //冒泡排序
        int[] arrays={2,301,9,99,1,98,687,232,189,65,30,45,120,20,37,32,72,11,21};
        BubbleSortMain(arrays);
        for(int index=0;index<arrays.length;index++){
            System.out.print(arrays[index]+",");
        }
    }

    private static void BubbleSortMain(int[] arrays) {
        int temp=0;
        //第一层for是用来判断每一个值都需要走一遍冒泡(除了最后一个值:别人都冒完了,最后一个肯定是最小的)
        for (int j = 0; j< arrays.length-1; j++) {
            //第二层for在第一层的基础上,每次冒出一个最大值,下一个就减少一个冒泡判断的数字
            for(int i = 0; i< arrays.length-1-j; i++){
                //如果发现前一个值大于下一个值,就交换位置
                if(arrays[i]> arrays[i+1]){
                    temp= arrays[i+1];
                    arrays[i+1]= arrays[i];
                    arrays[i]=temp;
                }
            }
        }
    }
}

2、选择排序

复制代码
package com.jdL.day21classwork;

public class SelectionSort {
    public static void main(String[] args) {
        //选择排序
        int[] arrays={2,301,9,99,1,98,687,232,189,65,30,45,120,20,37,32,72,11,21};
        selectionSort(arrays);
        for (int i = 0; i < arrays.length; i++) {
            System.out.print(arrays[i]+",");
        }
    }
    public static void selectionSort(int[] arrays){
        //1、第一轮:把索引0数据和后续索引的数值比较,小的往前挪
        int temp=0;
        //第一层for循环是依次拿出数组的每个元素(最后一个不用拿,因为前面的排完了,最后一个肯定是最大了)
        for (int j=0;j<arrays.length-1;j++) {
            //第二次for循环是把第一层for循环中拿到的数据依次和后面的数据比较,如果小就前移,第二层循环的时候
            //之前排序好的就不用重复排序了
            for(int i=1+j;i<arrays.length;i++){
                if(arrays[j]>arrays[i]){
                    temp=arrays[i];
                    arrays[i]=arrays[j];
                    arrays[j]=temp;
                }
            }
        }
    }
}

插入排序:

复制代码
package com.jdL.day21classwork;

import java.util.Arrays;

public class InsertionSort {
    public static void main(String[] args) {
        //插入排序
        int[] arrays={3,38,44,5,47,15,36,26,27,2,46,4,19,50,48};
        InsertionSort(arrays);
        for (int i = 0; i < arrays.length; i++) {
            System.out.print(arrays[i]+",");
        }

    }
    public static void InsertionSort(int[] arrays){
        //1、找到无序的数据从那个索引开始的,从数组0索引开始找,找到一个数据比后面一个要大,返回索引值
        int startIndex=0;
        for(int i=0;i<arrays.length;i++){
            if(arrays[i]>arrays[i+1]){
                startIndex=i+1;
                break;
            }
        }
        //2、从startIndex遍历
        for(int j=startIndex;j<arrays.length;j++){
            //把遍历到的数据插入到前面有序的数据里面
            //核心:其实是把无序里面的数据和前面有序里面的数据倒着依次比较,如果碰到大于无序数据的,就交换位置
            for(int i=j;i>0;i--){
                //这里其实可以认为是一个小的冒泡排序
                if(arrays[i-1]>arrays[i]){
                   int temp=arrays[i];
                   arrays[i]=arrays[i-1];
                   arrays[i-1]=temp;
                }
            }
        }
    }
}

递归算法:

心得:方法内部调用方法的时候,一定要更靠近出口

复制代码
求和:1~100之间的和
package com.jdL.day21classwork;
public class Recursion {
    public static void main(String[] args) {
        System.out.println(getSum(100));

    }
    public static int getSum(int number){
        if(number==1){
            return 1;
        }else{
            return number+getSum(number-1);
        }
    }
}

递归求5的阶乘

复制代码
package com.jdL.day21classwork;

public class RecursionFactorial {
    public static void main(String[] args) {
        //递归求5的阶乘
        System.out.println(getFactorial(5));
    }
    public static int getFactorial(int number){
        if(number==1){
            return 1;
        }else{
            return number*getFactorial(number-1);
        }
    }
}

快速排序:

复制代码
package com.jdL.day21classwork;

public class FastSort {
    public static void main(String[] args) {
        //快速排序
        int[] arrays={6,1,2,7,9,3,4,5,10,8};
        fastsort(arrays,0,arrays.length-1);
        for (int i = 0; i < arrays.length; i++) {
            System.out.print(arrays[i]+",");
        }
    }
    //参数1:排序的数组
    //参数2:排序的起始索引
    //参数3:排序的末尾索引
    public static void fastsort(int[] arr,int i,int j){
        int start=i;
        int end=j;
        //记录基准数
        if(start>end){
            return;
        }
        int basenumber=arr[i];
        while(start!=end){
            //利用end从后往前比基准数小的数字
            while(true){
                if(end<=start||arr[end]<basenumber){
                    break;
                }
                end--;
            }
            //利用start从前往后找比基准数大的数字
            while(true){
                if(end<=start||arr[start]>basenumber){
                    break;
                }
                start++;
            }
            //把end和start所指的数字交换
            int temp=arr[end];
            arr[end]=arr[start];
            arr[start]=temp;
        }
        //当start和end指向同一个元素的时候,上面的循环就会结束
        int temp1=arr[i];
        arr[i]=arr[start];
        arr[start]=temp1;
        //确定基准数左边的内容,递归调用
        fastsort(arr,i,start-1);
        fastsort(arr,start+1,j);
    }
}

需要注意:如果是从小到大排序,就需要先移动end

相关推荐
-大头.43 分钟前
Spring Bean作用域深度解析与实战
java·后端·spring
豆沙沙包?1 小时前
2025年--Lc298-1019. 链表中的下一个更大节点(栈)--java版
java·数据结构·链表
fengfuyao9851 小时前
匈牙利算法的MATLAB实现
java·算法·matlab
毕设源码-钟学长1 小时前
【开题答辩全过程】以 基于springboot农科所农作物信息管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
周杰伦fans1 小时前
C#中OrderByDescending 是LINQ扩展方法之一
开发语言·c#·linq
李绍熹1 小时前
Lua 语言基础教程
开发语言·junit·lua
周杰伦fans1 小时前
C# 中 SQL Server 数据库调优指南(小白友好版)
开发语言·数据库·c#
1***y1781 小时前
PHP在微服务中的微服务开发
开发语言·微服务·php
b***66612 小时前
Spring Boot 整合 Apollo 配置中心实战
java·spring boot·后端