是一种简单直观的排序算法,无论什么数据进去都是 O(n²)的时间复杂度。。
O(n²)这个怎么读啊?
n平方,或者n二次方
你的问题好奇怪
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/2n2 - 1/2*n
= O(n2)
上面是是我们进行严格的分析。其实我们从代码可以看出来,双重循环,并且每重循环都是和n正相关的。那么我们可以看出这是一个O(n2) 级别的算法
并不是所有的双重循环都是O(n^2)
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)级别的操作。因为内层的循环次数是不会随着数据规模改变而改变的。执行的基本代码次数和数据规模是呈正比的