首页 > 编程语言 >十大排序算法 Java版

十大排序算法 Java版

时间:2023-07-21 22:22:39浏览次数:40  
标签:index arr Java get int ++ 算法 排序 size

package algorithm;

import java.util.Collections;
import java.util.Vector;
public class Sort {
    //冒泡排序
    public void BubbleSort(int[] a){
        boolean flag = true;
        for (int i = 0; i < a.length; i++) {
            flag = false;//用于判断上次排序是否执行交换
            for (int j = 1; j < a.length-i; j++) {
                if(a[i] > a[j]){//执行交换
                    int temp = a[j];
                    a[j]=a[i];
                    a[i]=temp;
                    flag=true;
                }
            }
            if(!flag){
                break;
            }
        }
    }
    //选择排序
    public void SelectSort(int[] a){
        for (int i = 0; i < a.length; i++) {
            int minIndex = i;//每次循环初始化最小值所在位置
            for (int j = i+1; j < a.length; j++) {
                if(a[minIndex]>a[j]){
                    minIndex = j;
                }
            }
            if(minIndex != i){//判断是否有更小的数
                int temp = a[i];
                a[i]=a[minIndex];
                a[minIndex]=a[i];
            }
        }
    }
    //插入排序
    public void InsertionSort(int[] a){
        for (int i = 1; i < a.length; i++) {
            int key = a[i];
            int j;
            for (j = i-1; j >= 0 && a[j] > key; j--) {
                a[j+1] = a[j];
            }
            a[j] = key;
        }
    }
    //归并排序
    public void Merge(int[] a,int start,int mid,int end){//思想大致是,把数据分成左右两组,两组均为有序数组,然后再将其合并
        int leftIndex = start;
        int rightIndex = mid + 1;
        int[] temp = new int[end-start+1];//把排好的数据放到temp数组中
        int tempIndex = 0;
        while (leftIndex <= mid && rightIndex <= end) {
            if (a[leftIndex] <= a[rightIndex]) {
                temp[tempIndex++] = a[leftIndex++];
            }
            else {
                temp[tempIndex++] = a[rightIndex++];
            }
        }
        while (leftIndex <= mid) {
            temp[tempIndex++] = a[leftIndex++];
        }
        while (rightIndex <= end) {
            temp[tempIndex++] = a[rightIndex++];
        }
        for (int i = start; i <= end; i++) {//把temp中的排好的值传给原数组
            a[i] = temp[i - start];
        }
    }
    public void MergeSort(int[] a, int start, int end) {
        if (start >= end) {//当数组只有一个值时退出
            return;
        }
        int mid = (start + end) / 2;
        MergeSort(a, start, mid);//递归左边
        MergeSort(a, mid + 1, end);//递归右边
        Merge(a, start, mid, end);
    }
    //快速排序
    public void QuickSort(int[] a,int left,int right){
        int i=left;
        int j=right;
        int pivot = a[left];//定义一个基准
        while(i<j){//确保基准左边的数小于它,右边的数都大于它
            while(i<j&&a[j]>=pivot) {//注意是大于等于,没有等于可能会陷入死循环
                j--;
            }
            a[i]=a[j];
            while(i<j&&a[i]<=pivot){
                i++;
            }
            a[j]=a[i];
        }
        a[i]=pivot;
        if(i-left-1>0){//如果基准左边超过1个数,递归快排
            QuickSort(a,left,i-1);
        }
        if(right-i-1>0){//如果基准右边超过1个数,递归快排
            QuickSort(a,i+1,right);
        }
    }
    //堆排序
    public void Heap(int[] a, int len, int index){//构建一个大根堆,len是a数组的长度,index是第一个非子节点的下标
        int left = 2*index + 1; // index的左子节点
        int right = 2*index + 2;// index的右子节点

        int maxIdx = index;
        if(left<len && a[left] > a[maxIdx])     maxIdx = left;
        if(right<len && a[right] > a[maxIdx])     maxIdx = right;

        if(maxIdx != index)
        {
            int temp = a[maxIdx];
            a[maxIdx] = a[index];
            a[index] = temp;
            Heap(a, len, maxIdx);
        }
    }
    public void HeapSort(int[] a,int size){//size是a数组的长度
        for (int i = size/2-1; i >=0; i--) {//构建大根堆从最后一个非叶子结点向上
            Heap(a,size,i);
        }
        for(int i = size - 1; i >= 1; i--)
        {
            // 将当前最大的放置到数组末尾
            int temp = a[0];
            a[0] = a[i];
            a[i] = temp;
            Heap(a, i, 0); //将未完成排序的部分继续进行堆排序,这里令len等于i,确保最大位不再参与排序
        }
    }
    //希尔排序
    public void ShellSort(int[] a){
        int size = a.length;//数组长度

        for (int increment = size/2; increment > 0 ; increment/=2) {//分组思想的应用
            for (int i = increment; i < size; i++) {
                int temp = a[i];
                int j;
                for (j = i; j >= increment; j -= increment) {
                    if (temp < a[j - increment]) {
                        a[j] = a[j - increment];
                    }
                    else {
                        break;
                    }
                }
                a[j] = temp;
            }
        }
    }
    //计数排序
    void CountSort(int[] a, int max, int min) {//max为数组中的最大值,min为数组中的最小值
        int[] count = new int[max - min + 1];
        for (int i = 0; i < a.length; i++) {
            int num = a[i];
            count[num - min]++;
        }
        int index = 0;
        for (int i = 0; i <count.length; i++) {
            while (count[i] != 0) {
                a[index++] = i + min;
                count[i]--;
            }
        }
    }
    //桶排序
    public void BucketSort(Vector<Integer> a) {
        int min = a.get(0);
        int max = a.get(0);
        for (int i = 1; i < a.size(); i++) {//确定最大值和最小值
            if (a.get(i) > max) {
                max = a.get(i);
            }
            if (a.get(i) < min) {
                min = a.get(i);
            }
        }
        int bucketNum = (max - min) / a.size() + 1;//桶数
        Vector<Vector<Integer>> bucketArr = new Vector<>(bucketNum);
        //入桶
        for (int i = 0; i < a.size(); i++) {
            int num = (a.get(i) - min) / a.size();
            bucketArr.get(num).add(a.get(i));
        }
        //每个桶内部排序
        int index = 0;
        for (int i = 0; i < bucketArr.size(); i++) {
            Collections.sort(bucketArr.get(i));
            for (int j = 0; j < bucketArr.get(i).size(); j++) {
                a.setElementAt(bucketArr.get(i).get(j),index++);
            }
        }
    }
    //找到最大值
    int computeMax(Vector<Integer> arr) {
        int ma = arr.get(0);
        for (int i = 1; i < arr.size(); i++) {
            if (arr.get(i) > ma) {
                ma = arr.get(i);
            }
        }
        return ma;
    }

    //最长的位数
    int getDistance(Vector<Integer> arr) {
        int ma = computeMax(arr);
        int digits = 0;

        while (ma != 0) {
            digits++;
            ma = ma / 10;
        }
        return digits;
    }
    //基数排序
    void radixSort(Vector<Integer> arr) {

        Vector<Vector<Integer>> buckets = new Vector<>(10,arr.size());
        int distance = getDistance(arr);
        int temp = 1;
        int round = 1;//控制键值排序依据在哪一位
        while (round <= distance) {
            // 用来计数:数组counter[i]用来表示该位是i的数的个数
            Vector<Integer> counter = new Vector<>(10,0);
            // 将array中元素分布填充到bucket中,并进行计数
            for (int i = 0; i < arr.size(); i++) {
                int which = (arr.get(i) / temp) % 10;
                buckets.get(which).setElementAt(arr.get(i),counter.get(which));
                counter.setElementAt(counter.get(which)+1,counter.get(which));
            }
            int index = 0;
            // 根据bucket中收集到的arr中的元素,根据统计计数,在arr中重新排列
            for (int i = 0; i < 10; i++) {
                if (counter.get(i) != 0) {
                    for (int j = 0; j < counter.get(i); j++) {
                        arr.setElementAt(buckets.get(i).get(j),index++);
                    }
                }
                counter.setElementAt(0,i);
            }
            temp *= 10;
            round++;
        }
    }
}

 

标签:index,arr,Java,get,int,++,算法,排序,size
From: https://www.cnblogs.com/nashacjj/p/17572503.html

相关文章

  • 文心一言 VS 讯飞星火 VS chatgpt (64)-- 算法导论6.5 3题
    文心一言VS讯飞星火VSchatgpt(64)--算法导论6.53题三、要求用最小堆实现最小优先队列,请写出HEAP-MINIMUM、HEAP-EXTRACT-MIN、HEAPDECREASE-KEY和MIN-HEAP-INSERT的伪代码。文心一言:以下是使用最小堆实现最小优先队列的HEAP-MINIMUM、HEAP-EXTRACT-MIN、HEAP-DECREA......
  • Java反射机制
    1、前置知识1.1、java虚拟机的方法区1.1、java虚拟机的方法区java虚拟机有一个运行时数据区,这个数据区又被分为方法区,堆区和栈区,我们这里需要了解的主要是方法区。方法区主要用来存放已经被虚拟机加载的类信息、静态变量、方法等信息。当虚拟机需要装载某个类的时候,需要类......
  • javaweb从入门到架构学习路线图?
    javaweb从入门到架构学习路线图?1.学习Java基础知识和面向对象编程的概念。2.了解计算机网络基础知识,包括HTTP协议、TCP/IP协议等。3.掌握HTML、CSS和JavaScript等前端技术,了解前后端交互原理和基本的前端开发技巧。4.学习基于Java的Web开发技术,包括Servlet、JSP等。5.深入学......
  • 在docker内定位占用cpu过高的java线程
    参考​​>确定进程信息判断该进程是否在Docker容器中。使用cat/proc/<pid>/cgroup查看打印内容是否包含:/docker/。原理是Docker使用了Linuxcgroups使用pstree-s<pid>查看打印的进程树是否包含docker-containe,显示信息如下:systemd(1)───docker(1101)───docke......
  • java分布式从入门到架构学习路线?
    java分布式从入门到架构学习路线?初级阶段:1.Java基础知识:掌握Java语言的基本语法、面向对象编程的概念、集合框架和异常处理等基础知识。2.网络编程:了解Java网络编程的基本概念,学习Socket编程和网络通信协议,掌握TCP/IP和HTTP协议的基本原理。3.分布式系统概念:理解分布式系统......
  • java private变量
    如何实现Java的私有变量作为一名经验丰富的开发者,我很高兴能够教会你如何实现Java中的私有变量。私有变量是指只能在类内部访问的变量,其他类无法直接访问或修改它们。下面是一个简单的步骤表格,展示了整个实现私有变量的流程。步骤描述1创建一个Java类2声明一个私有......
  • java pcm转g711a
    JavaPCM转G711a实现流程步骤概览首先,我们来描述一下整个实现流程。下表列出了实现步骤及其详细说明:步骤描述1读取PCM文件2将PCM数据转换为G711a3将G711a数据写入文件在下面的文章中,我们将逐步解释每个步骤的具体实现。步骤详解步骤1:读取PCM文件在......
  • 到主机 的 TCP/IP 连接失败 java.net.ConnectException: Connection timed out
    org.apache.commons.dbcp.SQLNestedException:CannotcreatePoolableConnectionFactory(到主机的TCP/IP连接失败。java.net.ConnectException:Connectiontimedout:connect) 1、网络配置tcp/IP没有打开2、防火墙3、连接地址写错(工程文件中数据库连接写正确了,不代表编......
  • java preHandle 拦截器 跳过某个接口
    Java拦截器preHandle方法的使用及跳过某个接口拦截器是JavaWeb开发中常用的一种技术,可以拦截用户请求并在处理请求之前进行一些操作,比如身份验证、权限控制等。在Spring框架中,使用拦截器可以很方便地实现这些功能。在拦截器的preHandle方法中,我们可以根据需要来判断是否要拦截某......
  • java parseObject修改
    JavaparseObject修改在Java编程中,我们经常需要将字符串转换为对象,或者将对象转换为字符串。这种转换的过程被称为"解析"。Java中提供了多种方式来实现解析,其中之一就是使用parseObject方法。parseObject方法的作用parseObject方法是Java中的一个静态方法,它被定义在java.text.F......