常见排序算法(Java代码实现)

前言

学习算法和数据结构必备算法逻辑动态演示网站,收藏到就是赚到,链接: 数据结构动态演示网站

下面的代码单独理解会比较抽象,建议结合动态演示学习,更加直观

常见排序算法(时间复杂度)

O(n^2):冒泡排序、插入排序、选择排序

O(nlogn):归并排序、快速排序

1、冒泡排序

冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求,如果不满足则让它两个交换

java 复制代码
public static void MaoPaoSort(int[] numbers){
    int length = numbers.length;
    int temp;
    for (int i = 0; i < length; i++) {
        for (int j = 0; j < length-i-1; j++){
            if (numbers[j]>numbers[j+1]){
                temp = numbers[j];
                numbers[j] = numbers[j+1];
                numbers[j+1] = temp;
            }
        }
    }
}

2、插入排序

插入排序将数组数据分成已排序区间和未排序区间。初始已排序区间只有一个元素,即数组第一个元素。在未排序区间取出一个元素插入到已排序区间的合适位置,直到未排序区间为空。

java 复制代码
public static void insertSort(int[] numbers){
	 int length = numbers.length;
	 for (int i = 1; i < length; i++) {
	     int j = i-1;
	     int value = numbers[i];
	     for (; j>=0; j--){
	        if (numbers[j] > value){
	            numbers[j+1] = numbers[j];
	        }
	        else{
	            break;
	        }
	    }
	    numbers[j+1] = value;
	}
}

3、选择排序

选择排序将数组分成已排序区间和未排序区间。初始已排序区间为空。每次从未排序区间中选出最小的元素插入已排序区间的末尾,直到未排序区间为空。

java 复制代码
public static void selectSort(int[] numbers){
    int length = numbers.length;
    int temp;
    for (int i = 0; i < length; i++) {
        for (int j = i+1; j < length; j++){
            if (numbers[i] > numbers[j]){
                temp = numbers[i];
                numbers[i]  = numbers[j];
                numbers[j] = temp;
            }
        }
    }
}

4、归并排序

如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。

java 复制代码
public static void mergeSort(int[] numbers,int left,int right){
    if (left>=right){
        return;
    }
    int middle = (left+right)/2;
    mergeSort(numbers,left,middle);
    mergeSort(numbers,middle+1,right);

    mergeSortTemp(numbers,left,middle,right);
}
//归并排序工具类
private static void mergeSortTemp(int[] numbers, int left, int middle, int right) {
    int[] temps = new int[right-left+1];
    int tempsSize=0;
    int left0 = left;
    int left1 = middle+1;
    while (left0<=middle && left1<=right){
        if (numbers[left0]<=numbers[left1]){
            temps[tempsSize++] = numbers[left0++];
        }else{
            temps[tempsSize++] = numbers[left1++];
        }
    }
    while (left0 <= middle){
        temps[tempsSize++] = numbers[left0++];
    }
    while(left1 <= right){
        temps[tempsSize++] = numbers[left1++];
    }
    for (int i = 0; i <= right - left; i++) {
        numbers[left+i] = temps[i];
    }
}

5、快速排序

如果要排序数组中下标从p到r之间的一组数据,我们选择p到r之间的任意一个数据作为pivot (分区点) 。我们遍历p到r之间的数据,将小于pivot的放到左边,将大于pivot的放到右边,将pivot放到中间。经过这一步骤之后,数组p到r之间的数据就被分成了三个部分,前面p到q-1之间都是小于pivot的,中间是pivot,后面的q+1到r之间是大于pivot的。

java 复制代码
public static void quickSort(int[] numbers,int left,int right){
     if (left > right){
         return;
     }
     int i = left;
     int j = right;
     int base = numbers[left];
     while(i != j){
         while(numbers[j]>=base && i<j){
             j--;
         }
         while(numbers[i]<=base && i<j){
             i++;
         }
         int temp;
         temp = numbers[i];
         numbers[i] = numbers[j];
         numbers[j] = temp;
     }
     numbers[left] = numbers[i];
     numbers[i] = base;
     quickSort(numbers,left,i-1);
     quickSort(numbers,i+1,right);
 }
相关推荐
天天摸鱼的java工程师3 分钟前
假设你在开发订单系统时遇到高并发下库存扣减出错,如何解决?由浅入深分析
java·后端·面试
都叫我大帅哥4 分钟前
Redis的ZSet:从“青铜”到“王者”的排序神器
java·redis
一块plus7 分钟前
2025 年值得一玩的最佳 Web3 游戏
算法·设计模式·程序员
前端拿破轮10 分钟前
不是吧不是吧,leetcode第一题我就做不出来?😭😭😭
后端·算法·leetcode
一块plus13 分钟前
什么是去中心化 AI?区块链驱动智能的初学者指南
人工智能·后端·算法
Mr_Xuhhh13 分钟前
网络基础(1)
c语言·开发语言·网络·c++·qt·算法
前端拿破轮15 分钟前
😭😭😭看到这个快乐数10s,我就知道快乐不属于我了🤪
算法·leetcode·typescript
肖笙XiaoSheng15 分钟前
使用Gemini2.5 pro 优化我的定时任务(二)
java·后端·代码规范
小小霸王龙!16 分钟前
互联网大厂Java面试实录:Spring Boot与微服务在电商场景中的应用
java·spring boot·redis·微服务·电商
深栈解码19 分钟前
JUC并发编程 CAS运行机制详解
java·后端