虽然现在用自己写排序算法的机会很少,都是调用已经被封装好的方法,但是还是想回顾一下排序算法的思想:
排序算法基本有几类 先回顾一下冒泡排序
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
-
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
-
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
-
针对所有的元素重复以上的步骤,除了最后一个。
-
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
冒泡排序(从小到大)
数组排序例子解析
int[] arr = {43,23,44,555,22}
比较第一轮(目标数组{43,23,44,555,22}):
43>23 换位置 结果是{23,43,44,555,22}
43<44 不用换位置 结果{23,43,44,555,22}
44<555 不用换位置 结果{23,43,44,555,22}
555>22换位置 结果是{23,43,44,22,555}
第一轮比较了4次,结果是将最大的值555放在了数组最后位置。
比较第二轮(目标数组{23,43,44,22}):
23<43不用换位置 结果{23,43,44,22}
43<44不用换位置 结果{23,43,44,22}
44>22换位置 结果是{23,43,22,44}
第二轮比较了3次,结果是将最大的值44放在了目标数组最后位置。
比较第三轮(目标数组{23,43,22}):
23<43不用换位置 结果{23,43,22}
43>22换位置 结果{23,22,43}
第三轮比较了2次,结果是将最大的值43放在了目标数组最后位置。
比较第四轮(目标数组{23,22}):
23>22换位置 结果{22,23}
第四轮比较了1次,结果是将最大的值23放在了目标数组最后位置。
经过四轮比较久剩下一个数22因此就不用比较了,最终结果就是
{22,23,43,44,555}
代码书写:
通过上面的例子可知,一共比较了4轮,分析得知比较的轮数是总长度减一的次数,所以需要一个for循环控制比较轮数
for(int i=0; i<arr.length-1; i++)
每一轮比较都会比较上一轮剩下的数据 比较的次数是数组总长度减一减去之前的轮数,所以还需要一个for循环控制比较次数
for(int j=0; j<arr.length-1-i;j++)
所有代码可以这样写
int temp=0;
for(int i=0; i<arr.length-1; i++){
for(int j=0; j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
temp= arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
算法稳定性
-
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法比较