首页 > 代码库 > 交换排序算法---冒泡排序与快速排序
交换排序算法---冒泡排序与快速排序
本文介绍两种交换排序方法:冒泡排序、快速排序
冒泡排序
冒泡排序基本思想
每次遍历完序列都把最大(小)的元素放在最前面,然后再对剩下的序列重复前面的一个过程,每次遍历完之后待排序序列就少一个元素,当待排序序列减小为只有一个元素的时候排序就结束了.因此,复杂度在最坏的情况下是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); } }
交换排序算法---冒泡排序与快速排序