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日

相关文章

  • 常见的Java字节码操纵库有哪些?

    常见的Java字节码操纵库 Java字节码操纵库是指一些工具类库,用于在运行时动态修改Java字节码。常见的Java字节码操纵库有以下几种: ASM:是一个直接以Java字节码的形式生成、修改类的框架。它提供了一些比较底层的API,可以让开发者精细地控制字节码的生成和修改过程。 Javassist:是一个基于字节码操作的程序库,可以在运行时对字节码进行修改、…

    Java 2023年5月11日
    00
  • JAVA对称加密算法PBE定义与用法实例分析

    JAVA对称加密算法PBE定义与用法实例分析 简介 PBE(Password Based Encryption)是基于密码的加密算法,在数据加密中使用口令替代了传统的密钥,是一种轻量级加密算法。PBE算法不需要证书链和公钥证书等机构,实现简单便捷,容易实施。PBE算法又称为基于口令加密。 PBE算法加密实现步骤 1.搜集用户输入 从用户输入中获取需要加密的数…

    Java 2023年5月19日
    00
  • Storm框架整合springboot的方法

    下面是详细的Storm框架整合Spring Boot的方法: 1. 在Spring Boot项目中添加Storm依赖 首先需要在Spring Boot项目的pom.xml中添加Storm的依赖。在<dependencies>标签内添加以下内容: <dependency> <groupId>org.apache.storm&…

    Java 2023年5月15日
    00
  • JDBC用法小结

    下面是详细讲解“JDBC用法小结”的完整攻略。 JDBC简介 JDBC(Java Database Connectivity)是连接Java程序和数据库的一个Java API。它使用一组接口定义了数据库操作的标准,可以方便地让Java程序连接和操纵各种关系型数据库。 JDBC用法 JDBC的用法分为下面几步: 加载数据库驱动 在使用JDBC连接数据库时,第一…

    Java 2023年5月20日
    00
  • Java实现经典游戏超级玛丽的示例代码

    Java实现经典游戏超级玛丽的完整攻略 Java是一门跨平台的编程语言,能够运行在不同操作系统与硬件平台上。本文将介绍使用Java实现经典游戏超级玛丽的详细攻略,希望能够帮助读者更好地学习Java编程。 1. 搭建游戏框架 首先,我们需要搭建游戏的框架。在Java中,可以使用Swing或JavaFX等GUI库来创建图形化界面。我们选择使用Swing来实现。 …

    Java 2023年5月30日
    00
  • JavaWeb中文编码问题实例讲解

    JavaWeb中文编码问题实例讲解 什么是中文编码问题 中文编码问题是指,在JavaWeb应用中,由于不同的编码方式和不同的环境配置,导致在数据传输和存储过程中出现乱码等问题。 常见的中文编码方式 常见的中文编码方式有UTF-8、GBK、GB2312等。 解决中文编码问题的方法 设置Tomcat服务器的URIEncoding和useBodyEncodingF…

    Java 2023年5月20日
    00
  • 新浪开源轻量级分布式RPC框架motan简单示例解析

    新浪开源轻量级分布式RPC框架motan简单示例解析 简介 Motan是新浪微博公司开发的一个轻量级分布式RPC框架,主要用于各种服务之间的调用。其定位是一个高性能、易扩展、易用的分布式RPC框架。 安装配置 1. 下载motan 在项目的GitHub页面中,找到 Download 按钮,下载最新版的 motan-x.x.x-release.zip。 2. …

    Java 2023年5月19日
    00
  • 详解Spring Boot 配置加载顺序及属性加载顺序

    详解SpringBoot配置加载顺序及属性加载顺序 在 Spring Boot 应用程序中,配置文件的加载顺序和属性的加载顺序是非常重要的。在本文中,我们将详细讲解 Spring Boot 配置加载顺序及属性加载顺序的完整攻略,并提供两个示例。 配置文件的加载顺序 Spring Boot 应用程序中的配置文件有多种类型,例如 application.prop…

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