冒泡排序的概念和原理
对待要排序的序列,从前向后,通过比较相邻元素的值的大小,如果出现逆序则交换位置,就像是生活现象中加热水的过程中中,气泡会不断的上升,并且会越来越大一样,所以叫做冒泡排序。
冒泡排序处理思想
数据的位置交换
假如我们现在只有两个数据a和b,那么我们先对这相邻的两个数据a,b进行比较。
如果a>b那么我们让a和b交换位置。其代码完成如下:
if(a>b){
int temp=a;
a=b;
b=temp;
}
在上述代码中我们需要一个第三者临时值temp来帮助我们完成交换。
大的数据移至数组结尾
大的数据不断向后面移动,其实就是上一步的交换的步骤多次的实现,我们不断比较相邻的两个数值,如果前一个元素的值比后一个元素的值大,那么我们就将两个数值交换位置,如果前一位元素的值比后一个元素的值小,则不进行交换,if语句帮助我们完成判断。
for(int i=0;i<nums.length-1;i++){
if(nums[i]>nums[i+1]){
int temp=nums[i];
nums[i]=nums[i+1];
nums[i+1]=temp;
}
}
这样一来我们就成功将最大的元素移至数组的结尾。
依次向后移动大的数据
在完成上述步骤之后我们只需要将nums.length-1-1就能将第二大的数据移动到数组的length-1-1的位置上(nums.length-1已经是最大的数据了无需再管)
for(int i=0;i<nums.length-1-1;i++){
if(nums[i]>nums[i+1]){
int temp=nums[i];
nums[i]=nums[i+1];
nums[i+1]=temp;
}
}
注意:之所以使用的是小于length-1,其原因在于,我们使用的是前一位与后一位作比较,你不能让数组下标越界,我们是让i与i+1进行的比较。
整体的实现
这个nums.length-1可以看作为nums.length-1-0,这样我们是否可以理解为其实每一次都是nums.length-1-i呢?k每一次都在加一,因为我们每一次都将一个数据移动到了我们想要的位置,那么可操作的数据就减少一位。
for(int k=0;k<nums.length-1;k++){
for(int i=0;i<nums.length-1-k;i++){
if(nums[i]>nums[i+1]){
int temp=nums[i];
nums[i]=nums[i+1];
nums[i+1]=temp;
}
}
}
注意:循环的次数,我们一共有nums.length条数据,如果我们排列到最后一次是是两个数据在进行比较,当这两个数中大的那个数据移动到了后面,那么还有必要在对最后剩下的那个数据进行排序吗?它只剩下一个位置可以去了,所以我们只需要进行nums.length-1次排序即可。
自我感悟
冒泡排序的时间复杂度较高,为O(n*n)。初次学习可能不是很容易理解,应当多多练习。