Java七种排序

一,第一种:冒泡排序

冒泡排序的原理:数组两两比较,进行位置交换,经过一轮排序后,最大(小)的元素,放置在最后面
代码实现:

 int[] arr = {24, 69, 80, 57, 13};
        for (int j = 0; j < arr.length - 1; j++) {
            for (int i = 0; i < arr.length - 1 - j; i++) {
                if (arr[i] > arr[i + 1]) {
                    //值交换:采用中间变量的方式
                    int t = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = t;
                }
             }
        }
        System.out.println(Arrays.toString(arr));

二,第二种:选择排序

选择排序原理:从0索引处开始,拿着这个元素,跟后面的元素挨个比较,小的往前放,经过一轮比较后,最小元素,就会放在最前面
代码实现:

 int[] arr = {24, 69, 80, 57, 13,1,20,10,30};
        for (int index = 0; index < arr.length-1; index++) {
            for (int i = 1 +index; i < arr.length; i++) {
                if (arr[index] > arr[i]) {
                    int t = arr[index];
                    arr[index] = arr[i];
                    arr[i] = t;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
三,第三种:插入排序

直接插入排序,是一种最简单的排序方法.他的基本操作是将一个记录插入到一个长度为m 的有序表中,使之仍保持有序,从而得到一个新的长度为m+1的有序列表.假设有一组元素{k1,k2…,kn},排序开始就认为k1是一个有序序列,让k2插入上述表长为1的有序序列,使之成为一个表长为2的有序序列,然后让k3插入上述表长为2的有序序列,使之成为一个表长为3的有序序列,以此类推,最后让kn插入表长为n-1的有序序列,得到一个表长为n的有序序列.
代码实现:

int[] arr={10,-1,1,1,3,5,6,9,0,100,3,-9,1000};
        //外层循环定义轮次
        //[10]
        for (int i =1; i < arr.length; i++) {
            int j=i;
            //往之前的有序列表中插入元素,插入完之后,使之仍保持有序
            while (j>0&&arr[j]<arr[j-1]){//当前元素arr[i] 跟我前面一个元素去比 arr[i-1]
                int t=arr[j];
                arr[j]=arr[j-1];
                arr[j-1]=t;
                j--;
            }
        }
        System.out.println(Arrays.toString(arr));
四,第四种:快速排序

快速排序算法思想:分治法:比大小,再分区
1.从数组中取出一个数,作为基准数。
2.分区:将比这个数大或等于的数全放到他的右边,小于他的数
全放到他的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
实现思路:
1.将基准数挖出形成第一个坑。
2.由后向前找比他小的数,找到后挖出此数填到前一个坑中。
3.由前向后找比他大或等于的数,找到后也挖出此数填到前一个坑中。
4.再重复执行2,3两步骤。
代码实现:

public class 快速排序 {
    public static void main(String[] args) {
        int[] arr={8,6,3,5,7,4,2};
        QuickSortUtils.quickSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
}
 class QuickSortUtils {
    public static void quickSort(int[] arr, int start, int end) {
        //找出基准数,对左右两半,重复调用
        // 找出基准数,就是我刚才讲的,挖坑填数,用代码实现
        if (start < end) {
            int index = getIndex(arr, start, end);
            //以基准数的索引分为左右两半,对左右两半进行递归
            quickSort(arr, start, index - 1);//对左半边,进行递归
            quickSort(arr, index + 1, end);//对右半边,进行递归
        }
    }


    //挖坑填数
    private static int getIndex(int[] arr, int start, int end) {
        //定义三个变量
        int i = start;
        int j = end;
        //定义一个基准数
        int x = arr[i];
        //将基准数挖出形成第一个坑。
        //由后向前找比他小的数,找到后挖出此数填到前一个坑中。
        //由前向后找比他大或等于的数,找到后也挖出此数填到前一个坑中。
        //再重复执行2,3两步骤。
        while (i < j) {
            //2 由后向前找比他小的数,找到后挖出此数填到前一个坑中。
            while (i < j && arr[j] > x) {
                j--; //比他的大的,继续向前退
            }
            if (i < j) {
                arr[i] = arr[j];
                i++; //顺便让i递增一下
            }
            //3.由前向后找比他大或等于的数,找到后也挖出此数填到前一个坑中。

            while (i < j && arr[i] <= x) {
                i++; //后面的数,比他小 i继续往后找
            }
            if (i < j) {
                arr[j] = arr[i];
                j--; //顺便让j递减一下
            }
        }
        arr[i] = x;
        return i;
    }
}

五,第五种:归并排序

归并排序算法思想:归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略(分治法将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
代码实现:

public class 归并排序 {
    public static void main(String[] args) {
        //治理:将两个有序子序列,合并成一个有序序列
        int[] arr = {1, 4,6,0,-1,4,9,20,35,98, 9, 2, 4, 6, 8, 10,-4,1000,800};
        chaiFen(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    private static void chaiFen(int[] arr, int startIndext, int endIndex) {
        //计算中间索引
        int centerIndex=(startIndext+endIndex)/2;
        if(startIndext<endIndex){
            //递归拆左边
            chaiFen(arr, startIndext, centerIndex);
            //递归拆右边
            chaiFen(arr, centerIndex + 1, endIndex);
            mergeSort(arr, startIndext, centerIndex, endIndex);
        }
    }

    private static void mergeSort(int[] arr, int startIndtx, int centerIndex, int endIndex) {
        //定义一个临时数组
        int[] tempArray=new int[endIndex-startIndtx+1];
        //定义第一数组的起始索引
        int i=startIndtx;
        //定义第二个数组的起始索引
        int j=centerIndex+1;
        //定义临时数组的索引
        int index=0;
        //两个数组元素,进行对比归并
        while (i<=centerIndex&&j<=endIndex){
            if(arr[i]<=arr[j]){
                //把小的数放到临时数组中
                tempArray[index]=arr[i];
                i++; //递增一下索引
            }else{
                tempArray[index] = arr[j];
                j++; //递增一下索引
            }
            index++; //临时数组的索引也要递增
        }

        //处理剩余元素
        while (i<=centerIndex){
            tempArray[index]=arr[i];
            i++;
            index++;

        }
        while (j<=endIndex){
            tempArray[index] = arr[j];
            j++;
            index++;
        }
        //经过上面的操作后,临时数组中的元素就排序好了
        // System.out.println(Arrays.toString(tempArray));
        //把临时数组中的元素放到原数组中
        for (int k = 0; k < tempArray.length; k++) {
            arr[startIndtx+k]=tempArray[k];
        }
    }
}

六,第六种:希尔排序

基本思想:先将原表按照增量分组,每个子文件按照直接插入排序,用下一个增量的一半,再将文件分子文件,在直接插入排序,直到增量为1时,整个文件就排好了
代码实现:

public class 希尔排序 {
    public static void main(String[] args) {
    int[] arr = {9, 4, 5, 6, 1, 0, 3, 2, 10, 20, 11, 24, 32, 13};
    shellSort(arr);
    System.out.println(Arrays.toString(arr));
}

    private static void shellSort(int[] arr) {
        int jiange = 1;
        while (jiange <= arr.length / 3) {
            jiange = 3 * jiange + 1;
        }
        for (int h = jiange; h > 0; h = (h - 1) / 3) {
            for (int i = h; i < arr.length; i++) {
                for (int j = i; j > h - 1; j -= h) {
                    if (arr[j] < arr[j - h]) {
                        swapValue(arr, j, j - h);
                    }
                }
            }
        }


    }
    private static void swapValue(int[] arr, int i, int j) {
        int t = arr[i];
        arr[i] = arr[j];
        arr[j] = t;
    }

    private static void insertSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int j = i;
            while (j > 0 && arr[j - 1] > arr[j]) {
                swapValue(arr, j, j - 1);
                j--;
            }
        }
    }
}

七,第七种:基数排序

基数排序的实现不需要进行对关键字的比较,
只需要对关键字进行“分配”与“收集”两种操作即可完成。
基数排序的数组每个关键字都必须是正整数数值,且其中的最大值由个位、十位和百位构成,每个数位上的数字从 0 到 9,首先将各个关键字按照其个位数字的不同进行分配,其中最大数有多少位,就进行多少轮,排到最后时按顺序取出,就排好了

public class 基数排序 {
    public static void main(String[] args) {
        int[] arr = {19, 0, 35, 6, 9, 2, 198, 390, 208, 23, 195, 2990, 1980, 1000, 1987};
        int max = getMax(arr);
        int[][] temparr = new int[10][arr.length];
        int[] arr1 = new int[10];
        int len = String.valueOf(max).length();
        for (int i = 0, n = 1; i < len; i++, n *= 10) {
            for (int j = 0; j < arr.length; j++) {
                int num = arr[j] / n % 10;
                temparr[num][arr1[num]++] = arr[j];
            }
            int index = 0;
            for (int k = 0; k < arr1.length; k++) {
                if (arr1[k] != 0) {
                    for (int h = 0; h < arr1[k]; h++) {
                        //从桶中取出数组,放回原数组
                        arr[index] = temparr[k][h];
                        index++;
                    }
                    //取完之后,清空上一次的统计记录
                    arr1[k] = 0;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
    private static int getMax(int[] arr) {
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max) {
            }
            max = arr[i];
        }
        return max;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值