10.jpg

时间复杂度

概念

在一个算法上花费的时间

计算方法

  1. 忽略常量,如果运行时间是常数量级,则用1表示
  2. 忽略低次幂
  3. 忽略高次幂系数

让我们来看几个例子

1.常数算法O(1)

  1. int sumr=0;

2.线性算法O(N)

  1. //输出一个数组中的所有元素
  2. for (int k = 0; k <lengt ; ++k) {
  3. printf("%d\t",array[k]);
  4. }

3.O(n^2)

  1. for(int i=0;i<lenght-1;i++){
  2. for(int j=0;j<lenght-1;j++){
  3. if(Array[j]<Array[j+1])swap(Array,j,j+1);
  4. }
  5. }
  1. 折半查找O(logN)
  1. //求1到10的累加和
  2. int i = 0;
  3. int sum=0;
  4. while(i<=n){
  5. sum+=i;
  6. }

额外空间复杂度

除去样本量外还需要都少额外辅助空间,这个空间即为额外空间复杂度

冒泡排序(BubbleSort)

时间复杂度O(n^2)

  1. void maxSelectSort(int Array[],int lenght){
  2. for(int i=0;i<lenght;i++){
  3. for(int j=i+1;j<lenght;j++){
  4. if(Array[i]<Array[j])swap(Array,i,j);
  5. }
  6. }
  7. }
  8. void minSelectSort(int Array[],int lenght){
  9. for(int i=0;i<lenght;i++){
  10. for(int j=i+1;j<lenght;j++){
  11. if(Array[i]>Array[j])swap(Array,i,j);
  12. }
  13. }
  14. }

选择排序(SelectSort)

时间复杂度O(n^2)

  1. void maxSelectSort(int Array[],int lenght){
  2. for(int i=0;i<lenght;i++){
  3. for(int j=i+1;j<lenght;j++){
  4. if(Array[i]<Array[j])swap(Array,i,j);
  5. }
  6. }
  7. }
  8. void minSelectSort(int Array[],int lenght){
  9. for(int i=0;i<lenght;i++){
  10. for(int j=i+1;j<lenght;j++){
  11. if(Array[i]>Array[j])swap(Array,i,j);
  12. }
  13. }
  14. }

插入排序(InsertionSort)

跟数据状况有关

最好情况:有序=》O(N)

最差情况:逆序=》O(N^2)

平均情况:O(n^2)(最差情况下的指标)

  1. void minInsertionSort(int Array[],int lenght){
  2. for(int i=1;i<lenght;i++){
  3. for(int j=i-1; j>=0 && Array[j]>Array[j+1];j--){
  4. swap(Array,j,j+1);
  5. }
  6. }
  7. }
  8. void maxInsertionSort(int Array[],int lenght){
  9. for(int i=1;i<lenght;i++){
  10. for(int j=i-1; j>=0 && Array[j]<Array[j+1];j--){
  11. swap(Array,j,j+1);
  12. }
  13. }
  14. }