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

相关推荐
一个public的class几秒前
你在浏览器输入一个网址,到底发生了什么?
java·开发语言·javascript
有位神秘人2 分钟前
kotlin与Java中的单例模式总结
java·单例模式·kotlin
Jinkxs2 分钟前
Gradle - 与Groovy/Kotlin DSL对比 构建脚本语言选择指南
android·开发语言·kotlin
&有梦想的咸鱼&3 分钟前
Kotlin委托机制的底层实现深度解析(74)
android·开发语言·kotlin
golang学习记7 分钟前
IntelliJ IDEA 2025.3 重磅发布:K2 模式全面接管 Kotlin —— 告别 K1,性能飙升 40%!
java·kotlin·intellij-idea
爬山算法10 分钟前
Hibernate(89)如何在压力测试中使用Hibernate?
java·压力测试·hibernate
消失的旧时光-194332 分钟前
第十四课:Redis 在后端到底扮演什么角色?——缓存模型全景图
java·redis·缓存
BD_Marathon33 分钟前
设计模式——依赖倒转原则
java·开发语言·设计模式
BD_Marathon37 分钟前
设计模式——里氏替换原则
java·设计模式·里氏替换原则
Coder_Boy_39 分钟前
Deeplearning4j+ Spring Boot 电商用户复购预测案例中相关概念
java·人工智能·spring boot·后端·spring