伯乐论坛网

搜索
查看: 99|回复: 0

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

[复制链接]

1

主题

1

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2023-4-11 08:38:30 | 显示全部楼层 |阅读模式
在Java的时候,对于排序的应用需要熟练的掌握,这样才能够确保Java学习时候能够有扎实的基础能力。那Java有哪些排序算法呢?下面,先来详细说说Java经典的8种排序算法。
经典的排序算法有八种,分别为:

  • 冒泡排序
  • 选择排序
  • 插入排序
  • 归并排序
  • 希尔排序
  • 快速排序
  • 堆排序
  • 基数排序
其中冒泡排序、选择排序、插入排序称为三大基本排序。
虽然这三大基本排序算法时间复杂度都是O(n2),但是其实细细讨论之下,还是有各自的特点的。
一、冒泡排序(重点)

升序排列的实现思想:
1.将数组中相邻的两个数据元素进行比较,如果前面一个元素比后面的大,就把两者交换位置(一轮比较);
2.然后将上面的操作进行循环(比较n-1轮)。
排列过程如下图所示:


降序排列的实现思想:
1.将数组中相邻的两个数据元素进行比较,如果前面一个元素比后面的小,就把两者交换位置(一轮比较);
2.然后将上面的操作进行循环(比较n-1轮)。
基本实现
大家要注意,面试时经常会让我们手写冒泡排序和选择排序等算法,你必须牢牢地记住相关的代码实现哦。
public class Demo09 {
public static void main(String[] args) {
    // 冒泡排序--基本实现

    //待排序的数组
    int[] arr = { 1, 3, 46, 22, 11 };

    //控制需要比较几轮
    for (int i = 0; i < arr.length; i++) {
        //控制每一轮的比较次数
        for (int j = 0; j < arr.length - 1; j++) {
            //如果前面的比后面的数字大,则两者就进行交换
            if (arr[j] > arr[j + 1]) {
                //两数交换,需要一个“第三方”,好比两杯水互换,需要第三个杯子。

                //交换两个变量的值,必须借助一个临时变量。
                //定义一个新的临时变量,将数组中的前面的元素先赋值给临时变量
                int temp = arr[j];
                //后面的值赋值到前面的位置上
                arr[j] = arr[j + 1];
                //再将临时变量的值赋值到后面的位置上
                arr[j + 1] = temp;
            }
        }
    }
   
    //遍历排序后的数组
    for(int i=0;i<arr.length;i++) {
        System.out.print(arr+"\t");
    }
}
}这种实现方式比较容易理解,但并不是最优的实现方案,因为这种方案需要比较的次数较多。我们可以进一步对该方案进行优化,将比较的次数降下来,请继续往下看。
二、选择排序

选择排序升序思路:
1.将当前位置上的数,与它后面的每个数进行比较,选择出最小的那个数,交换到当前位置;
2.循环选择当前位置上的数。
选择排序降序思路:
1.将当前位置上的数,与它后面的每个数进行比较,选择出最大的那个数,交换到当前位置;
2.循环选择当前位置上的数。
2.1 实现案例
以下是以升序的方式实现的选择排序代码,供大家参考。
public class Demo12 {
public static void main(String[] args) {
    // 选择排序

    // 待排序的数组
    int[] arr = { 1, 3, 46, 22, 11 };

    for (int j = 0; j < arr.length-1; j++) {
        //选择下标为0的位置
        int min = j;
        
        //将当前这个数与后面的每个数进行比较
        for (int i = j+1; i < arr.length; i++) {
                //如果当前数字小于标记的最小值,则将当前数字标记为最小值
            if(arr[min] > arr) {
                min = i;
            }
        }
        
        //如果当前数字不是最小的,则进行交换
        if(min != j) {
            int temp = arr[j];
            arr[j] = arr[min];
            arr[min] = temp;
        }
    }
   
    //遍历排序后的数组
    for(int i=0;i<arr.length;i++) {
        System.out.print(arr+"\t");
    }
}
}三、Arrays.sort方法

Arrays工具类主要用于对数组进行排序、查找、填充、比较等的操作,该类存在于java.util包下,所以我们使用的第一步就是要先进行导包: import java.util.Arrays;
其中Arrays.sort()是Arrays类中的一个静态方法,用于对数组进行排序,我们可以直接调用。该方法有如下几种重载形式:
sort(T[] a):对指定T型数组按数字升序排序;
sort(T[] a, int formIndex, int toIndex):对指定T型数组中[formIndex,toIndex)数据按数字升序排序;
sort(T[] a, Comparator<? supre T> c): 依据比较器对T型数组进行排序;
sort(T[] a, int formIndex, int toIndex, Comparator<? supre T> c): 依据比较器产生的顺序对T型数组中的[formIndex,toIndex)进行排序。
接下来再给大家设计一个利用Arrays.sort方法实现的排序案例。
public class Demo13 {
public static void main(String[] args) {
    // 选择排序

    //遍历排序后的数组
    String[] names = { "cxk", "rose", "lihua", "lilei", "zhaosi" };
   
    //直接利用Arrays类提供的数组排序的方法,内部是基于“快速排序”实现的。
    Arrays.sort(names);

    for (int i = 0; i < names.length; i++) {
        System.out.print(names + "\t");
    }
}
}当然java数组就可以使用该方法来排序哦!!Arrays.sort()方法使用的是快速排序算法,可以对任意类型的数组进行排序,使用时需要实现Comparable接口或传入Comparator对象。
示例代码:
int[] nums = {5, 2, 9, 1, 5};
Arrays.sort(nums); // 对数组进行排序如果要对对象数组进行排序,需要实现Comparable接口或传入Comparator对象,示例代码:
class Person implements Comparable{
private String name;
private int age;
// ...省略构造方法和getter/setter方法
@Override
public int compareTo(Person o) {
return this.age - o.age;
}
}
Person[] persons = new Person[3];
persons[0] = new Person("Tom", 20);
persons[1] = new Person("Jerry", 18);
persons[2] = new Person("Mary", 22);
Arrays.sort(persons); // 对Person对象数组按照年龄升序排序另外,Java中还提供了其他排序算法的实现,例如归并排序、堆排序等,可以使用Collections.sort()方法或自己实现排序算法来实现数组排序。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2001-2013 Comsenz Inc.Powered by Discuz!X3.4
快速回复 返回顶部 返回列表