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

本文详细介绍了五种常见的排序算法,包括冒泡排序、插入排序、选择排序、归并排序和快速排序,以及它们的时间复杂度。通过示例代码演示了每种排序算法的工作原理。
摘要由CSDN通过智能技术生成

前言

学习算法和数据结构必备算法逻辑动态演示网站,收藏到就是赚到,链接: 数据结构动态演示网站
下面的代码单独理解会比较抽象,建议结合动态演示学习,更加直观

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

O(n^2):冒泡排序、插入排序、选择排序
O(nlogn):归并排序、快速排序

1、冒泡排序

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

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、插入排序

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

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、选择排序

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

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、归并排序

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

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的。

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);
 }
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

offer冲冲冲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值