Java常用的八种排序算法与代码实现

Java常用的八种排序算法与代码实现

在Java中,排序算法是非常重要的基础知识,掌握常用排序算法不仅可以提高程序员的知识水平,也可以在以后的工作中提高效率。本文将详细讲解八种Java常用排序算法的原理和代码实现。

冒泡排序(Bubble Sort)

冒泡排序也是常用的排序算法之一,其基本思想是通过比较两个相邻的元素,如果他们的顺序不对则交换他们直至序列变得有序。这里给出冒泡排序的Java代码实现。

public static void bubbleSort(int[] arr){
    int n = arr.length;
    for(int i=0;i<n-1;i++){
        for(int j=0;j<n-i-1;j++){
            if(arr[j]>arr[j+1]){
                //交换两数
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

选择排序(Selection Sort)

选择排序也是常用的排序算法之一,其基本思想是在未排序的数据中找到最小(大)的数据,将其放在序列的起始位置作为已排序数据,然后从余下的未排序数据中重复上述操作直至整个序列有序。这里给出选择排序的Java代码实现。

public static void selectionSort(int[] arr){
    int n = arr.length;
    for(int i=0;i<n-1;i++){
        int minIndex = i;
        for(int j=i+1;j<n;j++){
            if(arr[j]<arr[minIndex]){
                minIndex = j;
            }
        }
        //交换当前元素和最小元素
        int temp = arr[minIndex];
        arr[minIndex] = arr[i];
        arr[i] = temp;
    }
}

插入排序(Insertion Sort)

插入排序也是常用的排序算法之一,其基本思路是将一个数据插入到已排序好的有序序列中,从而得到一个新的,个数加一的有序序列。这里给出插入排序的Java代码实现。

public static void insertionSort(int[] arr){
    int n = arr.length;
    for(int i=1;i<n;i++){
        int key = arr[i];
        int j = i-1;
        while(j>=0 && arr[j]>key){
            arr[j+1] = arr[j];
            j--;
        }
        arr[j+1] = key;
    }
}

希尔排序(Shell Sort)

希尔排序也是常用的排序算法之一,它是插入排序的进化版,通过将数据按一定间隔分组,对每组数据执行插入排序,随着间隔逐渐减小,数据会越来越接近有序状态。最后对所有数据再执行一次插入排序,完成排序。这里给出希尔排序的Java代码实现。

public static void shellSort(int[] arr){
    int n = arr.length;
    //设置增量gap
    for(int gap=n/2;gap>0;gap/=2){
        //对每个分组进行插入排序
        for(int i=gap;i<n;i++){
            int temp = arr[i];
            int j = i-gap;
            while(j>=0 && arr[j]>temp){
                arr[j+gap] = arr[j];
                j -= gap;
            }
            arr[j+gap] = temp;
        }
    }
}

快速排序(Quick Sort)

快速排序也是常用的排序算法之一,它通过将一个数组分成两个子数组,然后递归排序两个子数组,完成对数组的排序。这里给出快速排序的Java代码实现。

public static void quickSort(int[] arr,int left,int right){
    if(left<right){
        int pivotIndex = partition(arr, left, right);
        quickSort(arr, left, pivotIndex - 1);
        quickSort(arr, pivotIndex + 1, right);
    }
}

private static int partition(int[] arr, int left, int right) {
    int pivot = arr[left];
    int i = left,j = right;
    while(i<j){
        while(i<j && arr[j]>=pivot){
            j--;
        }
        while(i<j && arr[i]<=pivot){
            i++;
        }
        if(i<j){
            //交换arr[i]和arr[j]
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    //交换arr[left]和arr[i]的值
    arr[left] = arr[i];
    arr[i] = pivot;
    return i;
}

归并排序(Merge Sort)

归并排序也是常用的排序算法之一,其基本思想是将一个数组递归地分成两个子数组,然后对子数组进行排序,最后将子数组合并成一个有序数组。这里给出归并排序的Java代码实现。

public static void mergeSort(int[] arr,int left,int right){
    if(left<right){
        int mid = (left + right) / 2;
        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);
        merge(arr,left,mid,right);
    }
}

private static void merge(int[] arr,int left,int mid,int right) {
    int[] temp = new int[right - left + 1];
    int i = left, j = mid + 1, k = 0;
    while (i <= mid && j <= right) {
        if (arr[i] < arr[j]) {
            temp[k++] = arr[i++];
        } else {
            temp[k++] = arr[j++];
        }
    }
    while (i <= mid) {
        temp[k++] = arr[i++];
    }
    while (j <= right) {
        temp[k++] = arr[j++];
    }
    for (int p = 0; p < temp.length; p++) {
        arr[left + p] = temp[p];
    }
}

堆排序(Heap Sort)

堆排序也是常用的排序算法之一,其基本思想是将待排序数列构造成一颗堆,然后依次取出堆顶元素并将其放置到有序区中,最终得到一个有序的数列。这里给出堆排序的Java代码实现。

public static void heapSort(int[] arr){
    int n = arr.length;
    //构造初始堆
    for(int i=n/2 - 1;i>=0;i--){
        adjustHeap(arr, i, n);
    }
    //排序,每次将堆顶元素和未排序区中的末尾元素交换
    for(int j=n-1;j>0;j--){
        //交换堆顶元素和未排序区的末尾元素
        int temp = arr[0];
        arr[0] = arr[j];
        arr[j] = temp;
        //调整未排序区构造新的堆
        adjustHeap(arr,0,j);
    }
}

private static void adjustHeap(int[] arr,int i,int n){
    int temp = arr[i];
    for(int k=2*i+1;k<n;k=2*k+1){
        if(k+1 < n && arr[k+1] > arr[k]){
            k++;
        }
        if(arr[k] > temp){
            arr[i] = arr[k];
            i = k;
        }else{
            break;
        }
        arr[i] = temp;
    }
}

计数排序(Counting Sort)

计数排序也是常用的排序算法之一,其基本思想是对于每一个非负整数 x,在数组中找出小于等于 x 的元素个数,然后利用这个信息将元素直接放到正确的位置上。这里给出计数排序的Java代码实现。

public static void countingSort(int[] arr){
    int min = arr[0];
    int max = arr[0];
    for(int i=1;i<arr.length;i++){
        if(arr[i]<min){
            min = arr[i];
        }
        if(arr[i]>max){
            max = arr[i];
        }
    }
    int[] countArr = new int[max-min+1];
    for(int i=0;i<arr.length;i++){
        countArr[arr[i]-min]++;
    }
    int index = 0;
    for(int i=0;i<countArr.length;i++){
        while(countArr[i]>0){
            arr[index++] = i+min;
            countArr[i]--;
        }
    }
}

总结

本文详细讲解了Java常用的八种排序算法及代码实现,包括冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、堆排序和计数排序,这些算法都有其特点和适用场景,程序员应根据实际情况选择合适的算法来实现排序操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java常用的八种排序算法与代码实现 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • 如何解决struts2日期类型转换

    解决struts2日期类型转换问题的完整攻略如下: 问题描述 在使用struts2框架中,如果后台 Action 接收的参数是日期类型,容易出现类型转换异常。例如,在前端页面中,日期类型通常采用字符串格式传递,如“2019-10-01”,但是在后台 Action 中,需要将该字符串转换为日期类型对象,否则无法正确处理业务逻辑。如果日期格式不一致,将会出现类型…

    Java 2023年6月2日
    00
  • 详解jvm对象的创建和分配

    我来为你详细讲解“详解jvm对象的创建和分配”的完整攻略。 什么是JVM? 首先,让我们来了解一下JVM是什么。JVM全称为Java Virtual Machine,即Java虚拟机,是Java程序的运行环境。JVM是Java应用程序与操作系统之间的一层抽象,负责管理程序的运行、内存分配等工作。 JVM对象的创建 在Java语言中,对象是通过new关键字来创…

    Java 2023年5月26日
    00
  • Java Apache Commons报错“ZipUnsupportedEncryptionMethodException”的原因与解决方法

    “ZipUnsupportedEncryptionMethodException”是Java的Apache Commons类库中的一个异常,通常由以下原因之一引起: 压缩加密方法不支持:如果压缩加密方法不支持,则可能会出现此异常。例如,可能会尝试使用不支持的压缩加密方法或压缩文件使用不支持的压缩加密方法。 以下是两个实例: 例1 如果压缩加密方法不支持,则可…

    Java 2023年5月5日
    00
  • 使用Spring Data R2DBC +Postgres实现增删改查功能

    使用Spring Data R2DBC + Postgres实现增删改查功能,需要完成以下步骤: 添加依赖项 在pom.xml文件中添加以下依赖项: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-…

    Java 2023年5月20日
    00
  • java实现停车场管理系统

    Java实现停车场管理系统攻略 1.需求分析 停车场管理系统需要实现以下功能: 停车:可以记录车辆的停放时间和位置(车位号) 取车:可以计算车辆停放的费用并将车位号记录,同时从停车记录中删除该车辆 车位管理:对车位进行增删改查,可以查询所有车位和空闲车位 停车记录查询:可以查询所有停车记录以及某个时间段的停车记录 2.数据库设计 使用MySQL数据库存储停车…

    Java 2023年5月24日
    00
  • Spring MVC 与 CORS跨域的详细介绍

    Spring MVC 与 CORS跨域的详细介绍 在Web开发中,跨域请求是一种常见的需求。CORS(Cross-Origin Resource Sharing)是一种机制,它允许Web应用程序从不同的域访问其资源。本文将详细介绍Spring MVC与CORS跨域的相关知识,并提供两个示例说明。 CORS跨域的实现原理 CORS跨域的实现原理是通过在HTTP…

    Java 2023年5月17日
    00
  • Java打印流原理及实例详解

    Java打印流原理及实例详解 Java打印流是Java IO包中非常常用的一个类库,通过打印流可以方便地向文件或者控制台等输出设备写入数据,下面我们来详细讲解Java打印流的原理及实例。 打印流的作用 打印流是为了方便输出数据而专门开发的一种处理流,在Java中,通过打印流我们可以将数据方便地输出到控制台或者文件中,可以轻而易举地实现输出文件、日志和其他信息…

    Java 2023年5月26日
    00
  • Spring和activiti进行整合过程解析

    下面我将详细讲解“Spring和activiti进行整合过程解析”的完整攻略。 一、前言 Spring是一个非常流行的Java框架,而activiti则是一个优秀的BPMN流程引擎。将这两者结合在一起,能够帮助我们更好地完成业务流程的处理。下面我将详细介绍Spring和activiti的整合过程。 二、整合步骤 引入依赖 首先需要在项目中引入Spring和a…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部