(算法)时间复杂度及冒泡排序(附:异或^的用法讲解)

目录

常数操作

时间复杂度

冒泡排序

异或^


  • 常数操作

释义:操作如果和样本的数据量没有关系,每次都是一个固定时间完成的操作。

比如:常见的算数运算(+-*/...)

常见的位运算(>>,|,&,^...)

赋值,比较,自加自减,数组中按地址偏移量直接命中等等。

  • 时间复杂度

释义:作为算法流程中,常熟操作数量的一个指标,也就是评判一个算法好坏的标准。通常用(念作big O)O()表示。

根据算法去总结它的常数操作数量的表达式,只保留其最高阶项;高阶项系数也不要,剩下发f(N),则时间复杂度为O(f(N))。

(ps:评判一个算法时,先看时间复杂度指标,再分析不同样本下实际运行时间。)

  • 冒泡排序

简单描述:一个无序数组,从左往右,每相邻两个数进行比较,值大的数交换位置到右边,完成有序排列。(每轮遍历都只能保证最右边的数字是最大的)---O(N²)

 模拟一个无序数组,每两个进行进行比较,上一面一行为数组中的元素,下面一行为它们的位置。

第一次:0~N-1

第二次:0~N-2

......

先自己思考,再看代码实现

public tatic void BubbleSort(int[] arr){
   if(arr==null||arr.length<2){
       break;
       }
   for(int i=0;i<arr.length;i++){
       if(arr[i]>arr[i+1]){
           swap(arr,i,i+1);//交换位置
       }
    }
    
}
public static void swap(int[] arr,int i,int j){
arr[i] = arr[i]^arr[j];
arr[j] = arr[i]^arr[j];
arr[i] = arr[i]^arr[j];
}

首先判断该数组存在,并且长度大于2,我们再进行排序(防止捣乱的),要循环N-1次,最后一位数的位置为N-1,在里面直接判断大小。

  • 异或^

解释这里写的swap函数,之前先了解一下^(异或),他是位运算的一种

eg:

1^0=1

1^1=0

0^0=0     相同为0,不同为1

它的基本性质

(1)N^N=0;N^0=N   任何一个数异或它自己都为0,任何数异或0,都为它本身。

(2)异或这种运算,符合结合律和交换律。

(3)右上面两条可以得出,一个数组中所有的元素都异或一遍,中间的无论以什么顺序先后,结果都不变。

再来看之前的swap函数

假设:a = 甲 ;b = 乙

a = a^b = 甲^乙;

b =a^b = 甲^乙^乙 = 甲^0 = 甲;

a = a^b = 甲^乙^甲 = 乙^0 = 乙;

至此,a,b的值进行了交换。

猜你喜欢

转载自blog.csdn.net/qq_48860282/article/details/123552680
今日推荐