常见排序算法(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);
 }
相关推荐
melck8 分钟前
liunx日志查询常用命令总结
java·服务器·网络
SweetCode11 分钟前
裴蜀定理:整数解的奥秘
数据结构·python·线性代数·算法·机器学习
守护者17013 分钟前
JAVA学习-练习试用Java实现“实现一个Hadoop程序,使用Hive进行复杂查询和数据筛查”
java·学习
程序员 小柴19 分钟前
docker的与使用
java·docker·eureka
ゞ 正在缓冲99%…24 分钟前
leetcode76.最小覆盖子串
java·算法·leetcode·字符串·双指针·滑动窗口
xuanjiong25 分钟前
纯个人整理,蓝桥杯使用的算法模板day2(0-1背包问题),手打个人理解注释,超全面,且均已验证成功(附带详细手写“模拟流程图”,全网首个
算法·蓝桥杯·动态规划
Seven9738 分钟前
【Guava】并发编程ListenableFuture&Service
java
WannaRunning38 分钟前
浅谈Tomcat数据源连接池
java·oracle·tomcat
惊鸿.Jh44 分钟前
【滑动窗口】3254. 长度为 K 的子数组的能量值 I
数据结构·算法·leetcode
明灯L44 分钟前
《函数基础与内存机制深度剖析:从 return 语句到各类经典编程题详解》
经验分享·python·算法·链表·经典例题