本文介绍两种交换排序方法:冒泡排序、快速排序
每次遍历完序列都把最大(小)的元素放在最前面,然后再对剩下的序列重复前面的一个过程,每次遍历完之后待排序序列就少一个元素,当待排序序列减小为只有一个元素的时候排序就结束了.因此,复杂度在最坏的情况下是O(N ^2).
将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。
如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。
(1)初始
R[1..n]为无序区。
(2)第一趟扫描
从无序区底部向上依次比较相邻的两个气泡的重量,若发现轻者在下、重者在上,则交换二者的位置。即依次比较(R[n],R[n-1]),(R[n-1],R[n-2]),…,(R[2],R[1]);
对于每对气泡(R[j+1],R[j]),若R[j+1].key<R[j].key,则交换R[j+1]和R[j]的内容。
第一趟扫描完毕时,"最轻"的气泡就飘浮到该区间的顶部,即关键字最小的记录被放在最高位置R[1]上。
(3)第二趟扫描
扫描R[2..n]。扫描完毕时,"次轻"的气泡飘浮到R[2]的位置上……
最后,经过n-1 趟扫描可得到有序区R[1..n]
注意: 1.第i趟扫描时,R[1..i-1]和R[i..n]分别为当前的有序区和无序区;
2.扫描仍是从无序区底部向上直至该区顶部;
3.扫描完毕时,该区中最轻气泡飘浮到顶部位置R[i]上,结果是R[1..i]变为新的有序区。
待排序的记录数组(23,34,5,7,56),设想待排序数组垂直竖立。
待排序数组(6,8,5,7,4)完整的排序过程
更多"冒泡排序测试",到《冒泡排序动画演示》
下面是Java实现代码
public class SortSolution {
static int count = 0;
/**
* 改进后的冒泡排序算法的实现:
* @param list 欲排序的数组
* @author tony
*/
public static void improvedBubbleSort(int[] list) {
boolean needNextPass = true;
for(int i = 0; i < list.length && needNextPass; ++i) {
needNextPass = false;
for(int j = list.length-1; j > i; --j) {
if(list[j] < list[j-1]) {
int temp = list[j];
list[j] = list[j-1];
list[j-1] = temp;
needNextPass = true;
count++;
}
}
//内层循环判断出有序后,便不再进行循环
if (!needNextPass) return;
System.out.print("第" + (i + 1) + "次排序结果:");
for (int k = 0; k < list.length; k++) {
System.out.print(list[k] + "\t");
}
System.out.println("");
}
System.out.print("最终排序结果:");
for (int l = 0; l < list.length; l++) {
System.out.print(list[l] + "\t");
}
}
public static void main(String[] args) {
int[] array = new int[6];
for (int k = 0; k < array.length; k++) {
array[k] = (int) (Math.random() * 100);
}
System.out.print("排序之前结果为:");
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + "\t");
}
System.out.println("");
runBubbleSort(array);
System.out.println("交换次数:"+count);
}
}
原文:http://www.cnblogs.com/ITtangtang/p/3952677.html