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日

相关文章

  • SSH框架网上商城项目第14战之商城首页UI的设计

    SSH框架网上商城项目第14战之商城首页UI的设计攻略 本次项目的目标是设计网上商城的首页UI界面,以下是完整攻略: 1. UI设计前期准备 在UI设计之前,为了能够更好的理解网上商城的运营模式,建议广泛了解目前热门商城的首页设计,如淘宝,京东和天猫等大型商城的首页设计,了解他们的页面布局和样式,可以借鉴他们的设计元素,同时也要挖掘出更多的特点,以创新和提高…

    Java 2023年6月15日
    00
  • 分析python动态规划的递归、非递归实现

    针对“分析Python动态规划的递归、非递归实现”这个主题,我将分为以下几个部分进行完整的讲解。 1. 什么是动态规划 动态规划(Dynamic Programming)是一种通过把原问题分解为相对简单的子问题的方式,以递推的方式求解复杂问题的技术。在动态规划中,我们通常会用到“备忘录”或“DP表”来记录以前求解过的值,从而避免重复计算,提高程序效率。 动态…

    Java 2023年5月26日
    00
  • Java Mybatis框架由浅入深全解析上篇

    Java Mybatis框架由浅入深全解析上篇 介绍 Java Mybatis框架是一个基于Java语言的数据映射框架,它是一种半自动化的ORM框架,通过XML配置文件或注解的方式将Java对象与数据库进行映射。 Mybatis的基本结构 Mybatis的基本结构包括四个部分: Configuration(配置类):读取mybatis配置文件中的信息,生成全…

    Java 2023年5月19日
    00
  • Java8中字符串处理库strman-java的使用示例

    针对Java8中字符串处理库strman-java的使用示例,我可以提供以下完整攻略: 一、什么是strman-java strman-java是一个Java8中的字符串处理库,该库提供了各种字符串处理方法,例如字符串分割、替换、格式化、加密、解码等。同时,该库支持链式调用,可用于流畅地处理字符串,方便简洁。strman-java库基于Node.js中的un…

    Java 2023年5月27日
    00
  • Spring Security自定义登录原理及实现详解

    针对 “Spring Security自定义登录原理及实现详解” 这个主题,我来给你讲一下完整的攻略。 1. 理解Spring Security的认证流程 认证流程是Spring Security中非常重要的概念。在用户登录时,Spring Security需要进行一系列步骤来验证用户身份。下面是Spring Security认证流程的核心步骤: 用户在登录…

    Java 2023年5月20日
    00
  • Mybatis的特点及优点

    让我来详细讲解一下Mybatis的特点及优点。 Mybatis的特点 是一款基于Java的ORM框架,它跟Hibernate等ORM框架不同的是,它对数据库的操作都是通过sql语句进行的,不需要编写复杂的持久化逻辑。因此,Mybatis具有以下几个特点: 1. SQL控制能力强 Mybatis允许开发者自定义SQL语句,并提供了非常灵活的SQL执行方式。开发…

    Java 2023年5月20日
    00
  • JDBC操作数据库的增加、删除、更新、查找实例分析

    JDBC操作数据库的增加、删除、更新、查找实例分析 Java Database Connectivity (JDBC) 是Java语言中用于在Java应用程序中连接和操作关系型数据库的标准API。它提供了一组Java接口,允许Java应用程序与各种关系型数据库进行通信,包括MySQL、Oracle、PostgreSQL等。 JDBC连接数据库 在使用JDBC…

    Java 2023年6月16日
    00
  • 如何安装jdk及安装MyEclipse的图文教程

    下面是如何安装JDK及MyEclipse的图文教程。 安装JDK JDK(Java Development Kit)是开发和运行Java应用程序所必需的软件开发工具包。在安装MyEclipse之前,需要先安装JDK,以下是安装步骤: 第一步:下载JDK 首先,前往Oracle官方网站下载JDK安装文件,网址是 http://www.oracle.com/te…

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