排序方法总结

本文总结了排序算法的时间复杂度和稳定性,包括插入排序、希尔排序、冒泡排序、快速排序、选择排序和归并排序等。其中,冒泡排序在最好情况下时间复杂度为O(n),快速排序在最好情况下为O(N*log2N),而希尔排序和快速排序虽然平均效率较高,但并不稳定。归并排序是效率高且稳定的排序算法。
摘要由CSDN通过智能技术生成

时间复杂度

常见的时间复杂度,按数量级递增排列依次为:常数阶O(1)、对数阶O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n2)、立方阶O(n3)、k次方阶O(nk)、指数阶O(2n)。常见的算法时间复杂度由小到大依次为:

                           c < log2N < n < n * Log2N < n^2 < n^3 < 2^n < 3^n < n!

其中c是一个常量,如果一个算法的复杂度为c 、 log2N 、n 、 n*log2N ,那么这个算法时间效率比较高

排序

冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
选择排序、希尔排序、快速排序、堆排序不是稳定的排序算法,
在这里插入图片描述
希尔排序:
希尔排序:最好的情况有序,复杂度为O(nlgn);最差的情况是O(N^2),但平均复杂度要比直接插入小,不稳定算法

冒泡排序:
1、冒泡排序是一种用时间换空间的排序方法,n小时好
2、最坏情况是把顺序的排列变成逆序,或者把逆序的数列变成顺序,最差时间复杂度O(N^2)只是表示其操作次数的数量级
3、最好的情况是数据本来就有序,复杂度为O(n),但是需要对代码变形,参考3.2节

快速排序:
1、n大时好,快速排序比较占用内存,内存随n的增大而增大,但却是效率高不稳定的排序算法。
2、划分之后一边是一个,一边是n-1个,这种极端情况的时间复杂度就是O(N^2)
3、最好的情况是每次都能均匀的划分序列,O(N*log2N)

归并排序:
1、n大时好,归并比较占用内存,内存随n的增大而增大,但却是效率高且稳定的排序算法。

1.1插入排序(for)

    //插入排序, O(n2)  O(n)正序或者倒叙  O(n2)  ||  O(1) 稳定排序
    public static void insertSort(int[] nums) {
   
        int len = nums.length;
        int temp, j;
        for (int i = 1; i < len; i++) {
   
            temp = nums[i];
            if (nums[i - 1] > temp) {
   
                for (j = i-1; j >=0 && nums[j]>temp; j--) {
   
                    nums[j+1] = nums[j];
                }
                nums[j+1] = temp;
            }
        }
    }

1.2插入排序(while)

    //插入排序, O(n2)  O(n)  O(n2)  ||  O(1) 稳定排序
    public static void insertSort1(int[] nums) {
   
        int len = nums.length;
        int temp, j;
        for (int i = 1; i < len; i++) {
   
            temp = nums[i];
            if (nums[i - 1] > temp) {
   
                j = i - 1;
                while (j >= 0 && nums[j] > temp) {
   
                    nums[j + 1] = nums[j];
                    j--;
                }
                nums[j + 1] = temp;
            }
        }
    }

1.3二分查找排序

    //二分查找排序 O(nlgn) O(n) O(nlgn)  || O(1)  稳定
    public static void binarySort(int[] nums) {
   
        int len = nums.length;
        int temp, low, high, mid;
        for (int i = 1; i < len; i++) {
   
            if (nums[i - 1] > nums[i]) {
   
                temp = nums[i];
                low=0;
                high = i - 1;
                while (low <= high) {
   
                    mid = (low + high) / 2;
                    if (nums[mid] <= temp) {
   
                        low = mid + 1;
                    } else {
   
                        high = mid - 1;
                    }
                }

                for (int j = i - 1; j >= low; j--) {
   
                    nums[j + 1] = nums[j];
                }
                //nums[j+1] = temp;
                nums[low] = temp;
            }
        }
    }

2.1希尔排序

    //希尔排序 O(n1.3) O(n) O(n2) || O(1)  不稳定
    public static void shellSort(int[] nums) {
   
        int len = nums.length;
        int gap = len 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值