java实现排序算法

冒泡排序

  • 思路

我们要对4,5,6,3,2,1从小到大进行排序。


冒泡排序只会操作相邻的两个数据,每次冒泡操作都会对相邻的两个元素进行比较,如果第一个数小于第二个数、则此次不移动位置,如果第一个数大于第二个数、则这两个数位置互换,保证大数往后移。


一次冒泡会至少让一个元素移动到他应该在的位置,重复n次,就完成了n个数据的排序工作

一次冒泡步骤
冒泡步骤

  • java代码实现
	/**
	 * flag为标识词,当前内循环若无交换操作,说明数组已经有序,无需进行剩余的循环比较
	 */
public void simpleSort(int[] param) {
        if (param.length <= 1) {
            return;
        }

        for (int i = 0; i < param.length; i++) {
            boolean flag = true;
            for (int j = 0; j < param.length - i - 1; j++) {
                if (param[j] > param[j + 1]) {
                    int t = param[j];
                    param[j] = param[j + 1];
                    param[j + 1] = t;
                    flag = false;
                }
            }

            if (flag) {
                break;
            }
        }
    }
  • 复杂度分析

空间复杂度:
冒泡的过程只涉及相邻数据的交换操作,需要常量级的临时空间,所以空间复杂度为O(1),空间复杂度为O(1)的排序称为原地排序算法。


时间复杂度:
最好情况下,数组本身有序,所以只需冒泡一次就可以直接结束,最好时间复杂度为O(n);最坏情况下,数组为倒叙排列,我们需要n次冒泡,耗时为:n(n+1)/2,所以最坏时间复杂度为:O(n2)。


稳定性分析:
为了保证数据稳定性,当前后两个数据大小相等时,我们不做互换操作,即可保证稳定性。上边的java代码为稳定的排序算法。

插入排序

  • 思路

我们要对6,5,4,3,2,1从小到大进行排序。
首先将数组分为两部分,第一个元素(6)为一组,剩余为第二组。
拿第二组的第一个元素(5)与(6)比较,结果5<6,(5)(6)位置互换,并且第二组减少一个元素,第一组增加一个元素。保证第一组中元素始终有序,第二组的元素依次插入到第一组中。当第二组元素个数为0时,插入排序完成。

  • java代码实现
   public void simpleSort(int[] param) {
        if (param.length <= 1) {
            return;
        }

        for (int i = 1; i < param.length; i++) {
            int t = param[i];
            int j = i - 1;
            for (; j >= 0; j--) {
                if (param[j] > t) {
                    param[j + 1] = param[j];
                } else {
                    break;
                }
            }
            param[j + 1] = t;
        }
    }
  • 复杂度分析

空间复杂度:
插入排序时,只设计到数据的比较、交换操作,需要常量级别的临时空间,因此空间复杂度为:O(1)


时间复杂度:
最好:O(n)
最坏:O(n2)
平均:O(n2)


稳定性分析:
当插入一个元素时,我们可以选择后插入的元素排在相等元素的后边,因此插入排序是稳定的排序算法。

选择排序

  • 思路

我们要对4,5,6,3,2,1从小到大进行排序。
首先从数组中找到最小值(1),然后将第一个元素与(1)互换位置。
之后从后5个元素中找到最小值(2),然后将第二个元素与(2)互换位置。
依次进行,找n次最小值,互换位置,选择排序完成

选择排序

  • java代码实现
   public void simpleSort(int[] param) {
        if (param.length <= 1) {
            return;
        }

        for (int i = 0; i < param.length; i++) {
            int min = param[i];
            int t = i;
            for (int j = i; j < param.length; j++) {
                if (min > param[j]) {
                    min = param[j];
                    t = j;
                }
            }
            param[t] = param[i];
            param[i] = min;
        }
    }
  • 复杂度分析

空间复杂度:
O(1),属于原地排序算法


时间复杂度:
最好、最坏、平均时间复杂度均为:O(n2)


稳定性分析:
由于每次都需要重新查找最小值,并且依次往以排序的部分最后插入,因此并不是一个稳定的排序算法

归并排序

  • 思路

我们要对4,5,6,3,2,1从小到大进行排序。

  • java代码实现
  • 复杂度分析

空间复杂度:


时间复杂度:


稳定性分析:

快速排序

  • 思路

我们要对4,5,6,3,2,1从小到大进行排序。

  • java代码实现
  • 复杂度分析

空间复杂度:


时间复杂度:


稳定性分析:

桶排序

  • 思路

我们要对4,5,6,3,2,1从小到大进行排序。

  • java代码实现
  • 复杂度分析

空间复杂度:


时间复杂度:


稳定性分析:

计数排序

  • 思路

我们要对4,5,6,3,2,1从小到大进行排序。

  • java代码实现
  • 复杂度分析

空间复杂度:


时间复杂度:


稳定性分析:

基数排序

  • 思路

我们要对4,5,6,3,2,1从小到大进行排序。

  • java代码实现
  • 复杂度分析

空间复杂度:


时间复杂度:


稳定性分析:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值