“冒泡”,顾名思义,气泡在水中时,由于重力(你也可以说是浮力)作用,从水底向水面浮去。
所谓的“冒泡排序”,就是将数组的相邻数字进行比较,将“较轻”的数字置换到数组的”上方“,将”较重“的数字置换到数组是”下方“,比如对一组数(假如以从小到大的顺序对数组进行排序):
3,1,6,9,0
进行了第一趟的比较操作之后,数组的顺序就变为了:
1,3,6,0,9
在这一过程中,‘3’先和‘1’进行比较,(因为是升序排序)‘3’比‘1’”重“,于是两数字发生位置互换,1,3,6,9,0,‘3’来到了第二个位置。接下来,它继续和下一个数字‘6’进行比较。此时‘3‘比’6‘”轻“,位置不变,‘3’将主动权交给了‘6’,于是‘6’便和下一个数字‘9’进行比较,此时显然遇到了刚才‘3’与‘6’比较时同样的情况,‘6’依然比‘9’”轻“。于是乎,’6‘只能又将主动权交给’9‘。’9‘按规则仍要和其后的’0‘进行比较,孰”轻“孰”重“就不用多说了,1,3,6,0,9 应运而生,’9‘作为”最重“的数字,被沉到了”最底“。
进行过第二趟的比较操作之后,数组的顺序又变为了:
1,3,0,6,9
’6‘作为前四个数中”最重“的数字,又沉到了”最底“(相对于前四个数的最底,因为第一趟中,已经沉淀出了本数组中的最大数‘9’)。以此类推,再将前3个数中最大的数沉底(1,0,3,6,9),再将前两个数中的最大数沉底(0,1,3,6,9),升序排序结束。降序也是一样的道理,只需依次向后比较”较轻“的数字即可。
原始算法
以下为Java代码的算法片段:
public static void bubbleSort(int[] arr){ //bubble sort the random array arr[]
for(int i=0;i
arr[j+1]){ //if arr[j] is "heavier" than arr[j+1]
swap(arr,j,j+1); //exchange each other's value
}
}
}
}
public static void bubbleSortImproved(int[] arr){ //改进的冒泡排序法
boolean needNextPass = true;
for(int i=0;i
arr[j+1]){ //则将标志位置为true;如果没有发生交换,则说明
swap(arr,j,j+1); //数组当前的顺序已经符合排序要求,没有必要再进行
needNextPass = true; //后面的排序了,循环的使命完成,数组排序结束。
}
}
}
}
/*
1.本文为原创技术文章,首发CSDN个人站点(http://blog.csdn.net/u011429947)。
2.所做文章仅用于相互学习和交流,转载请注明作者及出处。
3.由于个人能力有限,错误之处在所难免,如能指出,非常感谢。
*/