在大一的C语言课程中学习了排序算法中的冒泡算法,自以为已经掌握。但随着寒假自学的进展,发现冒泡算法没有当时想象的那么简单。
初学时:
复杂度 :O(n*n)
for(int i = 0;i<nums.length;i++) {
for(int j = i+1;j<nums.length;j++) {
if(nums[i] >nums[j]) {
int temp = nums[j];
nums[j] = nums[i];
nums[i] = temp;
}//升序
}
}//排序
经过今天下午对排序算法的学习,发现当时对于冒泡排序的看法过于稚嫩。之其实是一种最最简单同时也是效率最低的一种交换排序算法。
其中时间复杂度、空间复杂度虽然与真正的冒泡排序算法相同,但当处理数据量更多时,相对于冒泡排序,多出了许多无用的交换。
冒泡排序:
复杂度 :O(n*n)
for(int i = 0;i<nums.length;i++) {
for(int j = nums.length-1;j>i;j--) {
if(nums[j-1] >nums[j]) {
int temp = nums[j];
nums[j] = nums[j-1];
nums[j-1] = temp;
}//升序
}
}//排序
冒泡排序相对于最简单的交换排序来说,在排顶端数字时,也会对由下到上的数字进行排序。节省了交换次数。
但在我对对算法测试的时候,发现算法没有判断排序已经完成的语句。所以对于冒泡排序算法可以进行再次优化。
利用 isFlag 对数组进行标记!
冒泡排序优化:
复杂度 :O(n*n)
for(int i = 0;i<nums.length;i++) {
boolean isFlag = true;//设置标记为真
for(int j = nums.length-1;j>i;j--) {
if(nums[j-1] >nums[j]) {
int temp = nums[j];
nums[j] = nums[j-1];
nums[j-1] = temp;
isFlag = false;
}
}
if(isFlag)//判断标记是否发生变化,若未发生变化,则排序完成,跳出循环
break;
}//排序
优化后的冒泡排序算法避免了已经有序的情况进行判断造成的资源浪费。
注意:
很傻的错误,希望以后不要在犯。判断大小用的时数组中的元素。今天下午用了数组的交表进行比较。好傻。
第一次写,希望以后能坚持。加油!!!
原文地址:https://www.cnblogs.com/hby-gd/p/12249854.html