希望大家用心去读,内容不多,相信会对你有帮助
最原始冒泡
说明:一数组的乱序数列,两两相比较,大的放右边,每一轮比较将最大的一个数确定在数组尾部,并且每一轮比较后总的比较次数减一,依次循环。
举个栗子:
第一轮确定第一个最大的
再确定第二个最大的
再确定第三、第四。。。个最大的
上模板:
for(int end = array.length - 1;end > 0;end --){ // array.length数组长度
for(int begin = 1;begin <= end;begin ++){ // 注意这里begin是从1开始的
if(array[begin] < array[begin-1]){ // 如果右边的小于左边的,交换
int tmp = array[begin];
array[begin] = array[begin-1];
array[begin-1] = tmp;
}
}
}
改进冒泡
说明:如果一个乱序数组,在排序过程中,后面的数组尾部的数值逐个被确定,突然发现,前面的多个数值已经是有序的了,如果这样就不用排了,直接结束即可,减少了语句执行次数
举个梨子:
如图前三个数是有序的,这样先排好后两个
之后,当进行下一轮循环时,发现该循环中没有任何数值的交换(因为1、2、3已经有序了),故直接结束战斗
上模板:
for(int end = array.length -1;end > 0;end --){
boolean sorted = true; // 用来标记是不是前面的是有序的
for(int begin = 1;begin <= end;begin ++){
if(array[begin] < array[begin-1]){
int tmp = array[begin];
array[begin] = array[begin-1];
array[begin-1] = tmp;
sorted = false;
}
}
if(sorted) break; //如果执行,说明上一轮循环中if语句没有执行,说明没有交换,从而说明此时前面的序列已经是有序的了
}
再次改进冒泡
说明:上一次改进是排序过程中,可能前面是有序的,这次分析一下后面如果有一部分一上来就是有序的呢?其实道理差不多,这里就是,后面如果多个数已经有序了,则直接把后面这些有序的最前面的那个数,作为分界点,继续对整个数组从下标0到分界点进行排序
举个李子:
如图,4、5、6、7都是有序的,4和5、5和6、6和7,两两之间都没有进行交换,再往前看,3和4是最后一次交换的在这一轮中,故记录下4,下一轮从0-4进行排序,后面的不在考虑
之后对1-4分析,其实还有些情况,可能1-4中的后面几个又是有序的,则再次标记,减小范围
上模板:
for(int end = array.length - 1;end > 0;end --){
int sortedIndex = end; // 这里注意如果赋值为1 0 -1...则当所排序列是本身就是有序的,内层循环只需走一轮便会跳出,结束
for(int begin = 1;begin <= end;begin ++){
if(array[begin] < array[begin-1]){
int tmp = array[begin];
array[begin] = array[begin-1];
array[brgin-1] = tmp;
sortedIndex = begin; // 获取本轮循环中最后一次使用的begin
}
}
end = sortedIndex;
}
贵在坚持,难在坚持,成在坚持!