O(n²)这个怎么读啊?

是一种简单直观的排序算法,无论什么数据进去都是 O(n²)的时间复杂度。。
O(n²)这个怎么读啊?

n平方,或者n二次方
你的问题好奇怪

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/244972
  • 这篇博客也不错, 你可以看下基于比较冒泡排序-时间复杂度O(n^2)
  • 除此之外, 这篇博客: 算法的时间复杂度中的 O(n^2) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    • 选择排序
        public static void selectionSort(int [] arr,int n){
            for (int i=0;i<n;i++){
                int minIndex = i;
                for (int j=i+1;j<n;j++){
                    if (arr[j]<minIndex){
                        minIndex = j;
                    }
                }
                swap(arr,i,minIndex);
            }
        }
    

    对于O(n^2) 级别的算法一般都会有两重循环。
    i=0的时候,内层循环的if语句执行了n-1次。
    i=1的时候,内层循环的if语句执行了n-2次
    i=3的时候,内层循环的if语句执行了n-3次
    …直到i= n-1时候,内层执行 0次
    总共执行 (n-1)+(n-2)+(n-3)…+0 = (0+n-1)n/2
    = 1/2
    n2 - 1/2*n
    = O(n2)

    上面是是我们进行严格的分析。其实我们从代码可以看出来,双重循环,并且每重循环都是和n正相关的。那么我们可以看出这是一个O(n2) 级别的算法

    并不是所有的双重循环都是O(n^2)

    • 一个简单的打印代码(假设有n个年级,每一个年级有30的班,我们依此打印班级的编号信息)
       public void printInfomation(int n){
            for (int i=0;i<n;i++){
                for (int j=0;j<=30;j++){
                    System.out.println("Class:"+i + "No."+j);
                }
            }
        }
    

    虽然这里是双重循环,外层是n次,而内层是30,那么这里的代码会执行30n次基本操作。那么就是O(n)级别的操作。因为内层的循环次数是不会随着数据规模改变而改变的。执行的基本代码次数和数据规模是呈正比的


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^