首页 > 编程语言 >数据结构八大排序的java实现

数据结构八大排序的java实现

时间:2024-10-16 19:49:11浏览次数:10  
标签:arr 排序 java temp int void static 数据结构 public

冒泡排序

package 排序;

import java.util.Arrays;

public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = {5,7,4,2,0,3,1,6};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void sort(int[] arr) {
        for(int j=0;j<arr.length;j++) {
            for(int i=0;i<arr.length-1-j;i++) {
                if(arr[i]>arr[i+1]) {
                    //进行交换
                    int temp = arr[i];
                    arr[i] = arr[i+1];
                    arr[i+1] = temp;
                }
            }
        }
    }
}


堆排序

package 排序;

import java.util.Arrays;

public class HeapSort {  
    public static void main(String[] args) {  
        int[] arr = {65,67,46,2,0,34,16,66};  
          
        // 1. 构建大顶堆,从最后一个非叶子节点开始构建大顶堆
        for (int p = arr.length-1; p >= 0; p--) {  
            adjust(arr, p, arr.length);  
        }  
          
        // 2. 堆排序  
        for (int i = arr.length - 1; i > 0; i--) {  
            // 交换堆顶(当前最大值)和堆的最后一个元素  
            int temp = arr[0];  
            arr[0] = arr[i];  
            arr[i] = temp;  
              
            // 对剩余的元素重新调整为大顶堆  
            adjust(arr, 0, i);  
        }  
        System.out.println(Arrays.toString(arr));
    }  
      
    // 堆的维护(调整为大顶堆)  
    public static void adjust(int[] arr, int parent, int length) {  
        int child = 2 * parent + 1;  
        while (child < length) {  
            int rchild = child + 1;  
            int largest = child; // 假设左孩子最大  
              
            if (rchild < length && arr[rchild] > arr[largest]) {  
                largest = rchild; // 右孩子更大  
            }  
              
            // 如果父节点小于最大的子节点,则交换  
            if (arr[parent] < arr[largest]) {  
                int temp = arr[parent];  
                arr[parent] = arr[largest];  
                arr[largest] = temp;  
                  
                // 继续向下调整  
                parent = largest;  
                child = 2 * parent + 1;  
            } else {  
                break; // 父节点已经大于或等于最大的子节点,无需继续调整  
            }  
        }  
    }  
}

插入排序

package 排序;

import java.util.Arrays;

public class InsertSort {
    public static void main(String[] args) {
        int[] arr = {5,7,4,2,0,3,1,6};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void sort(int[] arr) {
        for(int i=1;i<arr.length;i++) {
            //用j和j+1进行比较交换
            for(int j=i-1;j>=0;j--) {
                if(arr[j]>arr[j+1]) {
                    //进行交换
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }else {
                    //跳出循环
                    break;
                }
            }
        }
    }
}
 

归并排序

package 排序;

import java.util.Arrays;

public class MergeSort {
    public static void main(String[] args) {
        int[] arr = {5,7,4,2,0,3,1,6};
        Mergesort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    //拆分
    public static void Mergesort(int[] arr,int left,int right) {
        //递归出口
        if(left==right) {
            return;
        }
        int mid = (left + right)/2;
        Mergesort(arr,left,mid);
        Mergesort(arr,mid+1,right);
        //合并
        merge(arr,left,right,mid);
    }
    public static void merge(int[] arr,int left,int right,int mid) {
        //定义第一段和第二段的开始
        int s1 = left;
        int s2 = mid+1;
        //定义临时空间
        int[] temp = new int[right-left+1];
        int index = 0;//定义游标遍历临时空间
        while(s1<=mid&&s2<=right) {
            if(arr[s1]<arr[s2]) {
                temp[index] = arr[s1];
                s1++;
                index++;
            }else {
                temp[index] = arr[s2];
                s2++;
                index++;
            }
        }
        //判断s1中是否有数据,如果有将其放入临时数组
        while(s1<=mid) {
            temp[index] = arr[s1];
            s1++;
            index++;
        }
        //判断s2中是否有数据,如果有将其放入临时数组
        while(s2<=right) {
            temp[index] = arr[s2];
            s2++;
            index++;
        }
        //将临时数组中的数据写回原数组
        for(int j=0;j<temp.length;j++) {
            arr[left + j] = temp[j];
        }
    }
}
 

快速排序

package 排序;  
  
import java.util.Arrays;  
  
public class QuickSort {  
    public static void main(String[] args) {  
        int[] arr = {65, 67, 46, 27, 10, 34, 16, 66};  
        quicksort(arr, 0, arr.length - 1); // 注意这里修改为 arr.length - 1  
        System.out.println(Arrays.toString(arr));  
    }  
  
    public static void quicksort(int[] arr, int left, int right) {  
        if (left >= right) {  
            return; // 当左索引不小于右索引时,无需排序  
        }  
  
        // 定义基准数  
        int base = arr[left];  
        // 定义i, j  
        int i = left;  
        int j = right;  
  
        while (i != j) {  
            // j游标从后往前移动,找比基准数小的  
            while (arr[j] >= base && i < j) {  
                j--;  
            }  
            // i游标从前往后移动,找比基准数大的  
            while (arr[i] <= base && i < j) {  
                i++;  
            }  
            // i和j交换  
            if (i < j) { // 确保不交换相同索引的元素  
                int temp = arr[i];  
                arr[i] = arr[j];  
                arr[j] = temp;  
            }  
        }  
  
        // i和j相遇,将基准数放到正确的位置  
        arr[left] = arr[i];  
        arr[i] = base;  
  
        // 排序左边和右边(不包括已经排序好的基准数位置)  
        quicksort(arr, left, i - 1); // 注意这里是 i - 1  
        quicksort(arr, i + 1, right);  
    }  
}

基数排序

package 排序;  
  
import java.util.Arrays;  
  
public class RadixSort {  
    public static void main(String[] args) {  
        int[] arr = {9, 7, 45, 2, 10, 3, 17, 66};  
        sort(arr);  
        System.out.println(Arrays.toString(arr));  
    }  
  
    public static void sort(int[] arr) {  
        int max = arr[0];  
        for (int j = 0; j < arr.length; j++) {  
            if (arr[j] > max) {  
                max = arr[j];  
            }  
        }  
        int maxLen = (max + "").length();  
  
        // 定义桶  
        int[][] bucket = new int[10][arr.length];  
        // 定义桶记录工具  
        int[] elementCounts = new int[10];  
        int n = 1;  
  
        for (int m = 0; m < maxLen; m++) {  
            // 遍历数组,将数组中的数据放入桶中  
            for (int i = 0; i < arr.length; i++) {  
                int digit = (arr[i] / n) % 10; // 获取当前位的数字  
                int count = elementCounts[digit];  
                bucket[digit][count] = arr[i];  
                elementCounts[digit]++;  
            }  
  
            // 将桶中的数据取出  
            int index = 0; // 遍历待排序数组的游标  
            for (int k = 0; k < elementCounts.length; k++) {  
                if (elementCounts[k] != 0) {  
                    for (int i = 0; i < elementCounts[k]; i++) {  
                        arr[index] = bucket[k][i];  
                        index++;  
                    }  
                }  
                elementCounts[k] = 0; // 重置桶计数  
            }  
            n *= 10; // 移动到下一个位数  
        }  
    }  
}

选择排序

package 排序;

import java.util.Arrays;

public class SelectSort {
    public static void main(String[] args) {
        int[] arr = {5,7,4,2,0,3,1,6};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void sort(int[] arr) {
        
        for(int j=0;j<arr.length;j++) {
            int min = arr[j];//记录最小值
            int minIndex = j;//记录最小值下标
            //找真正的最小值
            for(int i=j;i<arr.length;i++) {
                if(arr[i]<min) {
                    min = arr[i];
                    minIndex = i;
                }
            }
            //真正的最小值和待排序数组中的第一个进行交换
            arr[minIndex]  = arr[j];
            arr[j] = min;
        }
    }
}
 

希尔排序

package 排序;

import java.util.Arrays;

public class ShellSort {
    public static void main(String[] args) {
        int[] arr = {5,7,4,2,0,3,1,6};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void sort(int[] arr) {
        for(int grp = arr.length/2;grp>0;grp=grp/2) {
            for(int i = grp;i<arr.length;i++) {
                //arr[j] arr[j+grp]进行比较
                for(int j=i-grp;j>=0;j=j-grp) {
                    if(arr[j] > arr[j+grp]) {
                        int temp = arr[j];
                        arr[j] = arr[j+grp];
                        arr[j+grp] = temp;
                    }else {
                        break;
                    }
                }
            }
        }
    }
}
 

标签:arr,排序,java,temp,int,void,static,数据结构,public
From: https://blog.csdn.net/m0_73971785/article/details/142888820

相关文章

  • 深度解析计数排序:原理、特性与应用
    目录......
  • java_day13_ArrayList、Vector、LinkedList、泛型
    一、ArrayListCollection[接口]:List[接口]:元素有序,可以发生重复,有索引的概念ArrayList[具体的子类]:底层数据结构是数组,查询快,增删慢,线程不安全,效率高。Set[接口]:元素无序且唯一,没有索引代码案例publicclassArrayListDemo1{publicstaticv......
  • java 堆oom进程还在吗 在
    java堆oom进程还在吗我整理的一些关于【Java转架构设计】的项目学习资料+视频(附讲解~~)和大家一起分享、学习一下: https://d.51cto.com/bLN8S1实现"java堆OOM进程还在吗"的步骤1.理解问题在开始解决问题之前,首先需要理解"java堆OOM进程还在吗"这个问题的含义。Java中的OOM(Out......
  • 2024年 Java 面试八股文(20w字)
    第一章-Java基础篇1、你是怎样理解OOP面向对象   难度系数:⭐面向对象是利于语言对现实事物进行抽象。面向对象具有以下特征:继承:继承是从已有类得到继承信息创建新类的过程封装:封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口多态性:多态性是指允......
  • Java最新版面试题(全网最全、高频)
    面向对象三大特性1、面向对象的特征有哪些方面面向对象的特征主要有以下几个方面:抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。封装:封装把一个对象的属性私有......
  • java 查看jvm使用哪个垃圾回收器 -XX:+PrintCommandLineFlags
    java查看jvm使用哪个垃圾回收器在Java中,你可以通过查看JVM启动参数来确定使用的垃圾收集器。你可以使用java命令的-XX:+PrintCommandLineFlags参数来打印出JVM的启动配置,包括选择的垃圾收集器。例如,你可以通过以下命令运行Java应用程序来查看使用的垃圾收集器:java-XX:+PrintC......
  • Java中网络编程的学习
    Java网络编程学习总结本章目标了解计算机网络基础知识了解OSI七层参考模型熟悉TCP/IP协议熟悉常见网络协议掌握socket套接字编程计算机网络什么是计算机网络计算机网络是通过传输介质、通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共......
  • Java 初学 day12
    java12集合1、Collection到目前位置,我们学习过哪些可以存储元素的容器1、数组优点:不同的数组可以存储不同数据类型的元素缺点:长度不可变2、StringBuffer|StringBuilder优点:长度可以跟随元素的数量而改变缺点:里面的元素只有一种字符数据类型我们今后会......
  • Java基础之源
    目录JDK、JRE和JVM有何区别?Java的跨平台原理是什么?描述一下JVM加载class文件的原理机制?Java有什么核心优势让其成为世界上最流行的编程语言之一?编译和执行Java程序的命令是什么?JDK、JRE和JVM有何区别?JDK包含JRE,比JRE多了开发和调试的工具,比如把Java文件编译成class文......
  • 《深入理解Java异常处理:理论与实践》
    《深入理解Java异常处理:理论与实践》引言在Java编程中,异常处理是一个非常重要的概念。它帮助开发者构建健壮、可靠的程序。本文将详细介绍Java中的异常处理机制,包括异常类的层次结构、如何捕获和处理异常,以及在编程实践中的一些最佳实践。目录异常处理的基本概念Java异常类......