欢迎访问宙启技术站
智能推送

排序算法:Java实现常用的几种排序算法

发布时间:2023-06-21 05:50:19

排序算法是计算机科学中最常用和最基本的算法之一,用于将一组元素按照特定的规则进行排序,使其符合人类的需求,常见的排序算法有冒泡排序、插入排序、选择排序、快速排序、归并排序等。本文将介绍Java实现常用的几种排序算法。

1.冒泡排序

冒泡排序是一种简单的排序算法,它从头到尾遍历一次要排序的数列,每次比较相邻的两个元素大小,如果它们的顺序不符合所需的顺序,就交换它们的位置。经过一遍遍历之后,最大的元素排在了数列的末端,再次遍历前面的元素,如此重复,直到整个数列排好序为止。

Java代码实现:

public static void bubbleSort(int[] arr){

    int temp;//临时变量

    for(int i=0;i<arr.length-1;i++){//外层循环控制排序次数

        for(int j=0;j<arr.length-1-i;j++){//内层循环控制比较次数

            if(arr[j]>arr[j+1]){//如果前一个数大于后一个数,则交换它们的位置

                temp=arr[j];

                arr[j]=arr[j+1];

                arr[j+1]=temp;

            }

        }

    }

}

2.插入排序

插入排序是一种简单直观的排序算法,它的工作原理是在一个有序的数列中,不断地将待排序的元素插入到适当的位置,从而使数列保持有序。插入排序的时间复杂度为O(n^2)。

Java代码实现:

public static void insertSort(int[] arr){

    int i,j,tmp;

    for(i=1;i<arr.length;i++){ // 从第二个元素开始

        if(arr[i]<arr[i-1]){ // 如果当前元素小于前面的元素,则开始寻找位置

            tmp=arr[i]; // 将当前元素保存到临时变量

            for(j=i-1;j>=0&&arr[j]>tmp;j--){ // 逐个比较当前元素和前面的元素的大小

                arr[j+1]=arr[j]; // 如果前面的元素大于当前元素,就将前面的元素往后移

            }

            arr[j+1]=tmp; // 找到合适的位置,将当前元素插入

        }

    }

}

3.选择排序

选择排序也是一种简单的排序算法,它的基本思想是每次选出数列中最小(或最大)的元素,与数列的首位元素交换位置,再在剩下的元素中选出最小(或最大)的元素,与数列的次位元素交换位置,以此类推,直到整个数列排序完成。

Java代码实现:

public static void selectSort(int[] arr){

    int i,j,k,tmp;

    for(i=0;i<arr.length-1;i++){ // 外层循环控制排序次数

        k=i; // 初始化最小值的下标

        for(j=i+1;j<arr.length;j++){ // 内层循环查找最小值的下标

            if(arr[j]<arr[k]){ // 如果当前元素比最小值还小,则记录下标

                k=j;

            }

        }

        if(k!=i){ // 如果最小值的下标有变化,则交换它和当前元素

            tmp=arr[i];

            arr[i]=arr[k];

            arr[k]=tmp;

        }

    }

}

4.快速排序

快速排序也称为划分排序,是一种高效的排序算法,采用分治的思想,在排序的过程中不断地将数列分为两部分,一部分元素都比另一部分元素小,然后再分别对这两部分元素进行递归排序,直到整个数列排序完成。快速排序的时间复杂度为O(nlogn)。

Java代码实现:

public static void quickSort(int[] arr,int low,int high){

    int i,j,tmp,pivot;

    if(low<high){

        i=low;

        j=high;

        pivot=arr[low]; // 取 个元素为基准值

        while(i<j){

            while(i<j&&arr[j]>=pivot) j--; // 从后往前寻找比基准值小的元素

            if(i<j){

                tmp=arr[i];

                arr[i]=arr[j];

                arr[j]=tmp;

            }

            while(i<j&&arr[i]<=pivot) i++; // 从前往后寻找比基准值大的元素

            if(i<j){

                tmp=arr[i];

                arr[i]=arr[j];

                arr[j]=tmp;

            }

        }

        arr[i]=pivot; // 将基准值放到排序后的位置

        quickSort(arr,low,i-1); // 递归排序左侧部分

        quickSort(arr,i+1,high); // 递归排序右侧部分

    }

}

5.归并排序

归并排序是一种基于分治思想的排序算法,采用递归的方式将数列分成若干个小的子数列,然后对这些子数列进行排序,最后将它们合并成一个有序的数列。归并排序的时间复杂度为O(nlogn)。

Java代码实现:

public static void mergeSort(int[] arr,int start,int end){

    if(start<end){

        int middle=(start+end)/2;

        mergeSort(arr,start,middle); // 递归排序左半部分

        mergeSort(arr,middle+1,end); // 递归排序右半部分

        merge(arr,start,middle,end); // 合并排序结果

    }

}

public static void merge(int[] arr,int start,int middle,int end){

    int[] temp=new int[end-start+1]; // 临时数组,用于存放排序结果

    int i=start; // 左半部分数组的指针

    int j=middle+1; // 右半部分数组的指针

    int k=0; // 临时数组的指针

    while(i<=middle&&j<=end){ // 辅助数组归并过程

        if(arr[i]<arr[j]){

            temp[k++]=arr[i++];

        }else{

            temp[k++]=arr[j++];

        }

    }

    while(i<=middle){ // 如果左半部分数组还有剩余元素,将它们全部存入辅助数组

        temp[k++]=arr[i++];

    }

    while(j<=end){ // 如果右半部分数组还有剩余元素,将它们全部存入辅助数组

        temp[k++]=arr[j++];

    }

    for(int s=0;s<temp.length;s++){ // 将排序结果存回原数组中

        arr[start+s]=temp[s];

    }

}

总之,排序算法是一种常见的算法,它们在实际应用中起着重要的作用。以上介绍了Java实现常用的几种排序算法,它们都有各自的优劣和适用范围,在使用时需要根据具体情况选择合适的算法。