提示:有时看代码无法看出时间复杂度,最好画图,一目了然。
//时间复杂度为O(n)
for(int i=0;i<100;i++) {
}
//时间复杂度为O(logn)
for(int i=0;i<100;i*=2) {
}
//时间复杂度为O(n^2)
for(int i=0;i<100;i++) {
for(int j=0;j<100;j++) {
}
}
//时间复杂度为O(nlogn)
for(int i=0;i<100;i++) {
for(int j=0;j<=2*i;j++) {
}
}
一个代码及其函数图
for(int i=1;i<=2000;i*=2) {
for(int j=1;j<=i;j++) {
}
}
横坐标为i的值,纵坐标为执行次数,从图可知到了后面可认为时间复杂度为O(n);
排序的时间复杂度
//冒泡排序 时间复杂度O(n^2)
public static void bubble() {
//
for(int i=0;i<arr.length-1;i++) {
for(int j=0;j<arr.length-1;j++) {
if(arr[j]>arr[j+1]) {
int temp =arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
//选择排序 时间复杂度O(n^2)
public static void select() {
for(int i=0;i<arr.length-1;i++) {
int min=arr[i];
int minindex=i;
for(int j=i+1;j<arr.length-1;j++) {
if(min>arr[j]) {
min=arr[j];
minindex=j;
}
}
arr[minindex]=arr[i];
arr[i]=min;
}
System.out.println(Arrays.toString(arr));
}
//插入排序 时间复杂度O(n^2)
public static void insert () {
for(int i=1;i<arr.length-1;i++) {
for(int j=i;j>=0;j--) {
if(arr[j]>arr[j+1]) {
int temp =arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
//希尔排序 时间复杂度O(nlogn)
public static void shell() {
for(int grp=arr.length/2;grp>0;grp/=2) {
for(int i=grp;i<arr.length;i++) {
for(int j=i-grp;j>=0;j-=grp) {
if(arr[j]>arr[j+grp]) {
int temp=arr[j];
arr[j]=arr[j+grp];
arr[j+grp]=temp;
}
}
}
}
System.out.println(Arrays.toString(arr));
}
除了上述排序,时间复杂度还有
-
桶排序/基数排序 :O(kn) 经过好几轮入桶出桶
-
堆排序:O(nlogn)
-
快速排序:O(nlogn)
-
归并排序:O(nlogn)