当前位置: 首页 > article >正文

java实现归并排序和快速排序

归并排序

原理:将一个数组通过递归的方法分成无数小数组 将数组排序后然后合并成一个大数组 merge 为数组合并方法

import java.util.Arrays;

public class mergeStort {
    private mergeStort() {};
    public static <E extends Comparable <E>> void sort(E[] arr) {
        sort(arr,0, arr.length-1);
    }
    private static <E extends Comparable <E>> void sort(E[] arr, int l , int r) {
        if( l >= r) return ;
        int mid = (l+r)/2;
        sort(arr,l,mid);
        sort(arr,mid+1,r);
        merge(arr,l,mid,r);
    }
    // 归并方法 : 合并两个有序的区间 arr[i,mid] 和 arr [mid+1,r]
    private static  <E extends  Comparable <E>> void merge(E[] arr, int l ,int mid ,int r){
        E[] temp = Arrays.copyOfRange(arr,l,r+1);
        int i =l , j = mid + 1;
//        每轮循环为 arr[k] 赋值
        for(int k = l ; k <= r ; k++){
//arr[i] 和 arr[j]
            if(i > mid) {
                arr[k] = temp[j - l];
                j++;
            }else if(j > r) {
                arr[k] = temp[i - l];
                i++;
            }else if(temp[i -l].compareTo(temp[j - l]) <= 0){
                arr[k] = temp[i -l ];
                i++;
            }else {
                arr[k] = temp[j-l];
                j++;
            }
        }
    }
}

快速排序

1.找一个基点 左侧是小于这个基点的数据 右侧是大于基点的数据通过将左侧 Partition 方法是找基点的方法。

        sort(arr,0,arr.length-1);
    }
    private static <E extends Comparable<E>> void sort(E[] arr ,int l ,int r) {
        if(l >= r) return;
        int p = Partition(arr,l,r);
        sort(arr,l,p-1);
        sort(arr,p+1,r);
    }
    private static <E extends Comparable<E>> int Partition(E[] arr,int l, int r) {
        //arr[l+1 ... j] < v ;arr[j+1 ... i] > v
        int j = l;
        for(int i = l +1;i<=r;i++) {
            if(arr[i].compareTo(arr[l] ) < 0) {
                j++;
                swap(arr ,i ,j);
            }
        }
        swap(arr,l,j);
        return j;
    }
    public static <E> void swap(E[]arr,int i, int j) {
        E t = arr[i];
        arr[i] = arr[j];
        arr[j] = t;
    }
}


http://www.kler.cn/a/412029.html

相关文章:

  • Java 中的 Lambda 表达式和 JDK 21 新特性详解
  • vue3(十七)-基础入门之vue-nuxt路由
  • Qt界面篇:QMessageBox高级用法
  • .net的winfrom程序 窗体透明打开窗体时出现在屏幕右上角
  • SAP 零售方案 CAR 系统的介绍与研究
  • 速盾:CDN缓存的工作原理是什么?
  • Linux操作系统2-进程控制3(进程替换,exec相关函数和系统调用)
  • 【Linux】/proc/sys/vm/drop_caches
  • 使用 Nginx 在 Ubuntu 22.04 上安装 LibreNMS 开源网络监控系统
  • i春秋-文件包含绕过(PHP伪协议的使用)
  • Altium Designer学习笔记 22-23 PCB快捷键设置_PCB模块化布局
  • JDBC 设置 PostgreSQL 查询中 any(?) 的参数
  • Vue 的 computed 如何实现接受一个参数
  • 【模型学习之路】PyG的使用+基于点的任务
  • Mybatis---MyBatis映射文件SQL深入、多表查询
  • Amazon AWS公司介绍
  • docker部署的服务器数据备份
  • 16.迭代器模式设计思想
  • Python学习指南 + 谷歌浏览器如何安装插件
  • 【通俗理解】神经网络中步长缩小的奥秘:优化算法与卷积操作的影响
  • 研0找实习【学nlp】14--BERT理解
  • 【C语言】指针与数组的例题详解:深入分析与高级用法
  • C/C++绘制爱心
  • 【论文阅读】WGSR
  • 紫光档案管理系统 mergeFile SQL注入漏洞复现
  • MySQL闪回恢复:轻松应对数据误删,数据安全有保障