java-数据结构-排序

数据结构之九大排序(JAVA) 最近面临实习面试,由于自己准备投开发岗,据了解在面试中对于数据结构的考察是很重要的,其中对于查找、排序的算法考察尤为重要,所以又重回当年学习的数据结构好好复习。参考:《数据结构》 严蔚敏版、《考研数据结构》及各排序总结博客,整理出适合自己的排序总结以供参考 http://www.open-open.com/lib/view/open1453126714683.html http://www 阅读详情

1.冒泡排序

图示 :

//冒泡排序
public class BubbleSort extends Sort {
    public BubbleSort(int[] arr) {
        super(arr);
    }

    @Override
    public void sort() {
        for (int i = 0; i <arr.length ; i++) {
            for (int j = 1; j <arr.length-1 ; j++) {
                if (arr[j]>arr[j+1]){
                    swap(j,j+1);
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

2.选择排序

图示:

//选择排序
public class SelectSort extends Sort {
    public SelectSort(int[] arr) {
        super(arr);
    }

    @Override
    public void sort() {
        for (int i = 0; i <arr.length-1; i++) {
            int minindex=i;
            for (int j = i+1; j <arr.length ; j++) {
                if (arr[j]<arr[minindex]){
                    minindex=j;
                }
            }
            swap(i,minindex);
    }
        System.out.println(Arrays.toString(arr));
}
}

2.快速排序

2.1单路排序

public class QuickSort extends Sort {

    public QuickSort(int[] arr) {
        super(arr);
    }

    @Override
    public void sort() {
        sortsort(0, arr.length - 1);
        System.out.println(Arrays.toString(arr));
    }

    private void sortsort(int L, int R) {
        if (L>=R){
            return;
        }
        //对数组进行划分,并返回划分后的中点
        int p=partition(L,R)-1;
         sortsort(0,p - 2);
        sortsort(p + 1, R);
    }

    private int partition(int L, int R) {
        int j = R+1;
        int i=L+1;
        int v=L;
        while (i<j){
            if (arr[v]<=arr[i]){
                swap(i,j-1);
                j--;
            }else {
                i++;
            }
        }
        swap(L, j-1);

        return j;

    }
}

2.2双路排序

public class TwoQuickSort extends Sort {
    public TwoQuickSort(int[] arr) {
        super(arr);
    }

    @Override
    public void sort() {
        onemethod(0, arr.length - 1);
        System.out.println(Arrays.toString(arr));
    }

    private void onemethod(int L, int R) {
        if (L >= R) {
            return;
        }
        //中间值
        int p = middlevalue(L, R);
        onemethod(L, p - 1);
        onemethod(p + 1, R);
    }

    private int middlevalue(int L, int R) {
  //避免升序情况,让第一个元素随机和其他位置元素交换
        swap(L, (int) (Math.random() * (R - L + 1) + L));
        int v = arr[L];
        int i = L + 1;
        int j = R;
        while (true) {
            while (i <= R && arr[i] < v) {
                i++;
            }
            while (j >= L + 1 && arr[j] > v) {
                j--;
            }
            if (i > j) {
                break;
            }
            swap(i, j);
            i++;
            j--;
        }
        swap(L, j);
        return j;
    }

2.3三路排序

public class ThreeQuickSort extends Sort {
    public ThreeQuickSort(int[] arr) {
        super(arr);
    }

    @Override
    public void sort() {
        threequicksort(0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    private void threequicksort(int L, int R) {
        if (L>=R){
            return;
        }
        swap(L, (int) (Math.random() * (R - L + 1) + L));
        int v=arr[L];
        int i=L+1;
        int lt=L;
        int gt=R+1;
        while (i<gt){
            if (v<arr[i]){
                swap(i,gt-1);
                  gt--;
            }else if (v>arr[i]){
                swap(i,lt+1);
                i++;
                lt++;
            }else {
                i++;
            }
        }
        swap(L,lt);
       threequicksort(L,lt-1);
       threequicksort(gt,R);
    }
}

3.插入排序

public class insertSort extends Sort {

    public insertSort(int[] arr) {
        super(arr);
    }

    @Override
    public void sort() {
        int i = 0;
        while (i <= arr.length-1) {
            int j = i;
            if (i == 0) {
                i++;
            }
            while (j > 0) {
                if (arr[j] < arr[j - 1]) {
                    swap(j, j - 1);
                    j--;
                } else {
                    j--;
                }
            }
            i++;
        }
        System.out.println(Arrays.toString(arr));
    }

4.希尔排序

 如图,如果j-gap所对应值大于j所对应值,则交换值,然后在j指向j-gap,在进行对比,直到j-gap小于0或者j-gap的对应值小于j的对应值,此时i++;这个顺序直到i遍历到数组完,在重新得到gap,是gap/2得到新的,再继续刚所述操作。

//自己写的
public class ShellSort extends Sort {
    public ShellSort(int[] arr) {
        super(arr);
    }

    @Override
    public void sort() {
        int gap = arr.length / 2;
        int i = gap;
        int j = 0;
        while (true) {
            while (i <= arr.length - 1) {
                j=i;
                if (arr[j - gap] < arr[j]) {
                    i++;

                } else if (arr[j - gap] > arr[j]) {
                    swap(j - gap, j);
                    j=j-gap;
                  while (j-gap>0){
                      if (arr[j-gap]<arr[j]){
                               i++;
                               break;
                      }
                      else if (arr[j-gap]>arr[j]){
                          swap(j-gap,j);
                          j=j-gap;
                      }else {
                          i++;break;
                      }
                  }
                } else {
                    swap(j-gap+1,j);
                    i++;
                }
            }
            gap = gap / 2;
            i = gap;

            if (gap<1){break;}
        }
        System.out.println(Arrays.toString(arr));
    }
}

//正宗写法
public class ShellSort extends Sort{
    public ShellSort(int[] arr){
        super(arr);
    }

    @Override
    public void sort() {
        int len=arr.length;
        for (int gap =len/2; gap >0 ; gap=gap/2) {
            for (int i = gap; i <len ; i++) {
                int e=arr[i];
                int j=i;
                while (j-gap>=0&&arr[j-gap]>e){
                    arr[j]=arr[j-gap];
                    j=j-gap;
                }
                arr[j]=e;
            }
        }
    }
}


5.合并排序

public class MergeSort extends Sort {
    public MergeSort(int[] arr) {
        super(arr);
    }

    @Override
    public void sort() {
        mergesort(0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }

    private void mergesort(int l, int r) {
        if (l>=r){
            return;
        }
        int mid=(l+r)/2;
        //递归排序当前层级的右边
        mergesort(l,mid);
        //递归排序当前层级的左边
        mergesort(mid+1,r);
        //左边右边排完,进行合并,
        // 如果左边的最大值小于左边的最小值则不需要合并
        if (arr[mid]>arr[mid+1]){
            merge(l,mid,r);
        }
    }
// 合并操作
    private void merge(int l, int mid, int r) {
        //创建了个新数组,方便比较
        int[] aux=new int[r-l+1];
        //复制数组
        for (int k = l; k <=r ; k++) {
            aux[k-l]=arr[k];
        }
        int i=l,j=mid+1;
        for (int k=l;k<=r;k++){
            //左边完毕
            if (i>mid){
                arr[k]=aux[j-l];
            }else if (j>r){//右边完毕
                arr[k]=aux[i-l];
                i++;
            }else if (aux[i-l]<aux[j-l]){
                arr[k]=aux[i-l];
                i++;
            }else{
                arr[k]=aux[j-l];
                j++;
            }
        }
    }
}

6.桶排序

桶排序顾名思义,就是放几个桶并且桶有范围,然后把数放进去,在桶内进行其他排序。

 

//桶排序
public class bucketSort extends Sort {
    public bucketSort(int[] arr) {
        super(arr);
    }

    @Override
    public void sort() {
        //1.桶的个数 创建桶
        int max=0,min=0;
        for (int i = 0; i < arr.length ; i++) {
            if (arr[i]>max){
                max=arr[i];
            }
            if (arr[i]<min){
                min=arr[i];
            }
        }
        int bucketnum=(max-min)/ arr.length+1;
        System.out.println(bucketnum+"个桶");
        ArrayList<Integer>[] lists=new ArrayList[bucketnum];
        for (int i = 0; i <bucketnum ; i++) {
            lists[i]=new ArrayList<>();
        }
        //2.分配元素
        for (int i = 0; i <arr.length ; i++) {
            lists[(arr[i]-min)/arr.length].add(arr[i]);
        }
        //3.桶内排序
        for (int i = 0; i < lists.length ; i++) {
            lists[i].sort(new Comparator<Integer>() {
                @Override
                public int compare(Integer o1, Integer o2) {
                    return o1-o2;
                }
            });
        }
        int index=0;
        for (int i = 0; i < bucketnum ; i++) {
            for (int j = 0; j < lists[i].size(); j++) {
              arr[index++]=lists[i].get(j);
            }
        }
        System.out.println(Arrays.toString(arr));

    }
}

7.基数排序

创建0~9个位桶,每个桶实质相当于一个队列,比如说 , 排序如图

 我们先取个位排序那么应该是下图排列,然后每个桶一次出队

 变成如下顺序

 然后在按十位排序,继续上述操作。那么到底进行多少轮呢,取决于,原数组最大值的位数。

//基数排序
public class radixSort extends Sort {
    public radixSort(int[] arr) {
        super(arr);
    }

    @Override
    public void sort() {
        //1.轮数  获取最大执行几次
        int radixnum=radixmax(arr);
        System.out.println("轮数为:"+radixnum);
        //2.创建桶 list所有桶的集合 每一个桶是linkedList(当10个队列用)
        LinkedList<Integer>[] list=new LinkedList[10];
        //每一个桶中有list
        for (int i = 0; i <10 ; i++) {
            list[i]=new LinkedList<>();
        }
        //3.开始 分类-收集
        for (int r = 1; r <=radixnum; r++) {  //轮数
            //分类过程
            for (int i = 0; i < arr.length ; i++) {
               list[getIndex(arr[i],r)].offer(arr[i]);
            }
            //收集 遍历桶
            int index=0;
            //收集过程
            for (int i = 0; i < list.length; i++) {
                while (!list[i].isEmpty()){
                   arr[index++]= list[i].poll();
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }


    private int getIndex(int num, int r) {
        //345
        int count=0;
        for (int i = 1; i <=r ; i++) {
            count=num%10;
            num/=10;
        }
        return count;
    }

    private int radixmax(int[] arr) {
        int max=0;
        for (int i = 0; i < arr.length ; i++) {
            if (arr[i]>max){
                max=arr[i];
            }
        }
        return (max+"").length();
    }
}

8.计数排序

指原数组每个元素出现的次数,然后根据统计的次数排序。

 1.先确定原数组最大值和最小值,根据上图最大值为6,最小值为1

2.创建一个计数数组其长度为max-min+1

3.遍历原数组,计算arr[i](当前元素)-min ,这个计算的是当前元素在计数数组的位置,然后出现一次+1.

 4.然后根据次数依次放入到原数组中,num(原数组的数)=index(计数数组的下标)+min,变成

 

//计数排序
public class countSort extends Sort {
    public countSort(int[] arr) {
        super(arr);
    }

    @Override
    public void sort() {
     //1.创建一个计数数组
        int max=0,min=1;
        for (int i = 0; i <arr.length ; i++) {
            if (arr[i]>max){
                max=arr[i];
            }
            if (arr[i]<min){
                min=arr[i];
            }
        }
        System.out.println("最大值:"+max);
        System.out.println("最小值:"+min);
        int[] countarr=new int[max-min+1];
        System.out.println("计数数组长度:"+countarr.length);
        //2.开始计数
        for (int i = 0; i < arr.length ; i++) {
            countarr[arr[i]-min]++;
        }
        //3.按照计数,开始排序   num=index+min
      int k=0;
        for (int index = 0; index <countarr.length ; index++) {
            for (int count = 0; count <countarr[index] ; count++) {
                int num=index+min;
                arr[k++]=num;
            }

            }

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


    }
}

附:排序接口

public abstract  class Sort {
    public int[] arr;
    public Sort(){}
    public  Sort(int[] arr){
        this.arr=new int[arr.length];
        for (int i = 0; i <arr.length ; i++) {
            this.arr[i]=arr[i];
        }
    }
    public abstract void sort();
    public void swap(int i,int j){
        int temp=arr[i];
        arr[i]=arr[j];
        arr[j]=temp;
    }
}

数据结构中的三种排序(java) 由于马上要参加一个笔试,又拿出了满是灰尘的数据结构课本,想把基本的数据类型和算法给看一看,由于找工作是java方面,所以有意把排序的算法用java写一下,水平很是一般,希望自己能够一步一个脚印,踏实走下去,如果能给大家一些启发就更好了。 代码全部测试过,如有瑕疵,请批评指正。 首先介绍引自百度---插入排序的基本思想是:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适 阅读详情

相关推荐

第 2 章:PassThrough 直通滤波

通过设置某个维度(如 x、y、z 或 rgb)的取值范围,仅保留该范围内的点,从而达到**点云裁剪(裁边)**或过滤异常值的目的。所有在该范围之外的点会被移除(可选是否保留);点云中包含背景、地面或传感器噪声,需要过滤;通过 z 轴过滤,只保留桌面上方的物体;多轴组合过滤(如同时过滤 x、y、z);可用于地面剔除、车载点云预处理等场景。不支持一次过滤多个字段,可多次调用;仅处理某一层或某一区域的点云数据。原始点云中包含地面、墙面、背景等;在区域裁剪、前景提取中广泛使用;设定一个轴(如z轴);

yumeiguo的博客 337

Java数据结构----排序

稳定性定义 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持 不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳 定的;否则称为不稳定的。 插入排序 直接插入排序 直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到 一个新的有序序列 。 当插入第i(i>=1)个元素

m0_61801103的博客 2016

RKNN 端侧部署必看:YOLOv11 Pose 姿态估计模型转换与性能优化实战

随着人工智能技术在边缘计算领域的快速发展,姿态估计作为计算机视觉的重要分支,在智能监控、人机交互、体感游戏等场景中展现出巨大的应用潜力。本文深入研究了YOLOv11 Pose模型在Rockchip RKNN平台上的部署方案,从理论基础、模型转换、平台优化到实际部署进行了全面阐述。通过详细的技术分析和实验验证,证明了RKNN平台能够有效提升YOLOv11 Pose的推理性能,在RK3588硬件平台上实现了高达100 FPS的实时姿态检测,为边缘计算场景下的姿态估计应用提供了高效的解决方案。

m0_71589036的博客 183

数据结构之排序(java)

介绍其中数据结构基本排序思想及其算法实现

qq_48382240的博客 627

智能手表 BOM 表与版本管理记录

试产与量产阶段 智能手表 BOM 表与版本管理记录

hoony123的博客 1053

理想L9高通QAM8797座舱域控制器全拆解|全网独家复现 硬件架构升级、电源散热优化、多屏低延迟交互、车机系统赋能高端智能座舱落地

随着智能汽车向舱驾一体、全域智能化、多模交互方向迭代,传统单一功能座舱芯片已无法满足多屏高刷渲染、全车AI语音、车内视觉感知、高速车载通信的叠加算力需求。2026款全新理想L9作为旗舰级智能SUV,全面搭载高通新一代旗舰座舱域控制器QAM8797,搭配自研马赫M100 AI芯片、国产车规主控芯片,构建起高性能、高可靠、低延迟的车载中央计算平台。

getusushu的博客 380

Java数据结构之 常见排序

一. 冒泡排序二. 选择排序三. 直接插入排序四. 希尔排序是直接插入排序的一种更高效的版本,又称“缩小增量排序”

huijerry的博客 1796

6、SAP HANA 建模全解析

本文全面解析了 SAP HANA 建模的核心内容,包括属性视图、分析视图和计算视图的创建与使用。文章详细介绍了建模工具的安装、不同视图类型的适用场景及操作步骤,并通过对比和案例分析帮助读者更好地理解建模流程。此外,还涵盖了建模过程中的注意事项及性能优化建议,为 SAP HANA 用户提供实用的建模指导。

juice的博客 203

Java数据结构—排序

Java数据结构—排序 一、简单排序 1.Comparable接口 Java提供了一个接口Comparable就是用来定义排序顺序规则的。 **需求:**通过Comparable接口提供比较规则,来判断哪个学生年龄大(Student(name,age)) Student类 public class Student implements Comparable<Student>{ private String name; private int age; public

TY_JUST的博客 548

Python 爬虫实战:就业市场趋势数据抓取与行业洞察

在当今竞争激烈的就业市场中,了解行业趋势和就业形势对于求职者、学生以及人力资源专业人士来说至关重要。通过获取和分析就业市场数据,我们可以深入了解不同行业的招聘需求、薪资水平、技能要求等关键信息,从而为职业规划和人才发展提供有力支持。

yansideyucsdn的博客 1406

AutoSAR MemMap模块概述及配置参数详解

这个模块是干啥的?它是用来配置Memory Mapping and Compiler Abstraction module。

4508

【Java 数据结构】排序

基于比较的排序算法详解,插入排序,选择排序,交换排序,归并排序,直接插入排序,希尔排序,选择排序,冒泡排序,快速排序(Hoare版,挖坑版,前后指针版),复杂度及稳定性分析

ZXT的博客 1770

Linux ARM平台开发系列讲解(摄像头V4L2子系统) 2.12.5 V4L2 control的原理和实现

既然涉及到视频输入,就会有很多与 相关的效果,比如对比度、饱和度、色温、白平衡等等,这些都是通用的、必须的控制项,并且大多数仅需要设置一个整数值即可。 内核中已经为我们提供了这个控制类型的,我们只需要明确自己需要添加什么控制类型,然后将其添加进内核中即可。该部分摄像头代码一半厂家会提供驱动或者相对应的参数,否则没有图像处理知识很难开发出来。 返回总目录...

DSMGUOGUO的博客 1436

JAVA数据结构 排序

一、概念 1. 排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。平时如果提到排序,通常指的是排升序(非降序)。通常意义上的排序,都是指的原地排序(in place sort)。 2. 两个相等的数据,如果经过排序后,排序算法能保证其相对位置不发生变化,则我们称该算法是具备稳定性的排序算法。 二、七大基于比较的排序 三、插入排序 把整个区间被分为有序区间和无序区间,每次选择无序区间的第一个元素,在有序区间内选择合适的位置插入。实现代码如下: ...

TTong34的博客 389

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

数据结构java语言的各种排序

数据结构排序下面是作者自己在学习Java语言时做的一些基础练习的排序,在此和大家分享:             将包含几种基本的排序方法的算法(先写两做最常用的排序,后续将更新更多的排序方式,有什么需要的请留言):冒泡排序,选择排序;                     冒泡排序:&lt;span style="background-color: rgb(255, 255, 102);"&gt...

JUSTIN的博客 394

JAVA数据结构与算法之————堆排序

JAVA数据结构与算法之————堆排序 直接上代码: public class Heap { public void heapSort(int[] heap){ /*从最后一个叶子节点的父节点往前调整堆,直到根节点*/ for(int i = (heap.length - 1) / 2; i > 0; i--){ heapAdj...

qq_36007633的博客 569

Java数据结构——八大排序

Java数据结构中的八大排序,直接插入排序,希尔排序,直接选择排序,堆排序,冒泡排序,快速排序,归并排序,计数排序

2401_89019969的博客 3035

数据结构java排序代码_数据结构排序算法Java实现

闲的无聊又拿起了大学的数据结构的书看起来 《数据结构(c语言版)》严蔚敏 吴伟民编著。里面有几个排序算法,感觉挺好玩的,就想着写出来玩玩。package test.sort;/*** @Title: TODO* @Description: TODO* @author:* @date: 2014-8-10 上午11:20:43**/public class quickSort {private st...

weixin_33955307的博客 147

java 权重排序_设计一种java数据结构,按照权重进行排序

展开全部publicenumSortBy{Number,Weights1,Weights2}importjava.util.Comparator;publicclassMyComparatorimplementsComparator{privateSortBysortBy;publicMyComparator(SortBysortBy){32313133353236313...

weixin_32998893的博客 807

数据结构 Java 实现 插入排序

public class inserSort { static void insertSort(List<Integer> list) { int length = list.size(); int j, i, b; for (i = 1; i < length; i++) { b = list.get(i); if (b < list.get(i - 1)) { .

qq_19551571的博客 228

JAVA数据结构与算法之选择排序

前言 最近面临毕业就业,在复习数据结构与算法,为了更好地掌握,加深印象,所以决定写一些博客来知识复现。 温馨提示:这篇博客可能不适合刚学数据结构的新手。 算法的简单介绍 选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:第一次从 arr[0]~arr[n-1]中选取最小值,与 arr[0]交换,第二次从 arr[1]~arr[n-1]中选取最小值,与 arr[1]交换,第三次从 arr[2]~arr[n-1]中选取最小值,与 arr[2] 交换,…,第 i 次从 arr[i-1

iCanCode的博客 228

JAVA数据结构与算法之————希尔排序

JAVA数据结构与算法之————希尔排序 个人理解:希尔排序其实是增量不为1的冒泡排序。 代码: import java.util.Arrays; /* * 希尔排序算法的时间复杂度为O(n^1.5), 空间复杂度为O(1) * */ public class ShellSort<E extends Comparable> { private Swap<E> s ...

qq_36007633的博客 594

Java数据结构——堆排序

1. 什么是堆排序*********** 2. 大堆顶,小堆顶********* 3. 构造堆*******************

NoBug 1122

JAVA数据结构与算法之插入排序

前言 最近面临毕业就业,在复习数据结构与算法,为了更好地掌握,加深印象,所以决定写一些博客来知识复现。 温馨提示:这篇博客可能不适合刚学数据结构的新手。 算法的简单介绍 插入排序(Insertion Sorting)的基本思想是:把 n 个待排序的元素看成为一个有序表和一个无序表,开始时有 序表中只包含一个元素,无序表中包含有 n-1 个元素,排序过程中每次从无序表中取出第一个元素,把它的排 序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。 代码实现 package

iCanCode的博客 278

常见的数据结构Java实现及常见的排序算法

文章目录一、常见数据结构Java实现1、链表2、栈3、队列4、树二、排序算法1、冒泡排序2、选择排序3、插入排序4、归并排序5、快速排序 一、常见数据结构Java实现 1、链表 (1)leetcode提供结构 public class ListNode{ int val; ListNode next; ListNode(int x) { val = x; ...

luyangsiyi的博客 245

JAVA进阶-set,Comparable排序,数据结构-树

简单介绍set,Comparable排序,数据结构-树

qinqin__的博客 712
上一篇: java-数据结构-链表
下一篇: java-数据结构-树
秃头泥猴
博客等级 码龄6年 9粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值