java排序、计数和归并排序详解

本文深入探讨了计数排序和归并排序两种高效排序算法的实现原理及代码细节。通过具体示例展示了计数排序如何利用数组统计元素频率进行排序,以及归并排序如何递归地拆分和合并数组实现排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计数排序




public class JiShuSort {
        public static void main(String[] args) {
                int[] arr={23,12,23,45,2,2,2,13};
                countSort(arr);
        }

        //定义排序的方法
        public static void countSort(int[] arr){
                //求需要排序数组的最大值
                int max=arr[0];
                for(int a:arr){
                        if(max<a){
                                max=a;
                        }
                }

                //定义一个数组
                int[] newarr=new int[max+1];

                //循环遍历老数组  放在新数组中
                for(int a:arr){
                        //将原始值  下标    次数---值
                        newarr[a]++;
                }

                //输出结果
                for(int i=0;i<newarr.length;i++){//循环下标
                        for(int j=0;j<newarr[i];j++){//循环次数
                                System.out.print(i+"\t");
                        }
                }

        }



}



归并排序

import java.util.Arrays;

public class MergeSortFinal {
        public static void main(String[] args) {
                int[] arr = { 23, 12, 34, 56, 7, 65, 89, 2 };
                chai(arr, 0, arr.length - 1);
                System.out.println(Arrays.toString(arr));
        }

        // 定义一个方法
        public static void chai(int[] arr, int left, int right) {
                // 出口
                if (left >= right) {
                        return;
                } else {
                        // 找规律
                        // 找中间的下标
                        int mid = (left + right) / 2;
                        // 左半部分 拆
                        chai(arr, left, mid);
                        // 右半部分 拆
                        chai(arr, mid + 1, right);

                        // 合并
                        merge(arr, left, right, mid);

                }

        }

        public static void merge(int[] arr, int left, int right, int mid) {
                // 整个数据集 left right
                // 两个小数据集 左侧 left---mid 右侧 mid+1----right
                // 1.创建一个新的数组 长度两个数组的长度之和
                int[] newarr = new int[arr.length];

                // 循环遍历两个数组
                // 定义两个变量 分别记录每一个数组循环遍历的下标
                int m = left; // 记录第左侧数据下标变化
                int n = mid + 1; // 记录右侧数据集 下标变化

                // 定义两个变量 记录两个数据集的最大下标的
                int x = mid; // 左侧的最大下边的
                int y = right; // 右侧最大下标的

                // 变量 记录新数组的下标
                int index = left;

                // 只要两个数组都有元素 开始比较
                while (m <= x && n <= y) {
                        // 开始进行比较 每一个数组去一个元素
                        if (arr[m] < arr[n]) {
                                newarr[index++] = arr[m++];
                        } else {
                                newarr[index++] = arr[n++];
                        }
                }

                // 出了循环
                // 可能左侧 还有数据
                while (m <= x) {
                        newarr[index++] = arr[m++];
                }

                // 可能是右侧还有数据
                while (n <= y) {
                        newarr[index++] = arr[n++];
                }

                // 将newarr对应的排完序的元素 给arr重新赋值
                // newarr left---right之间的元素 --- arr的 left--right
                for (int i = left; i <= right; i++) {
                        arr[i] = newarr[i];
                }

                System.out.println(Arrays.toString(newarr));

        }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值