基于比较的算法之一:冒泡排序
冒泡排序是基于比较的排序中比较基本的算法。
以升序排序目的为例,算法的中心思想是从头至尾的比较两两相邻的元素,如果发现有反序(决定了稳定性)的则交换两个相邻元素。完成第一趟比较后最大的元素放到了最末端。
第二趟从头至尾的比较不用比较最后一个元素(最大元素已经在最末端正确位置),所以比第一次少比较了一个元素,这趟比较完成后,第二个元素到达正确位置。
持续进行这样的操作,直到只剩下最后一个最小元素被放到了第一个位置,排序完成。
假设n个元素排序:
1.最好时间复杂度 O(n),比较次数C=n,即所有数据都已经按照小-〉大的顺序排好,只需要做n次比较,M=0次移动
但是此种情况需要有一个记录数据是否移动的变量
2.最差的时间复杂度为O(n2),即所有数据是原始反序的,则第i次扫描数据时的比较次数是Ci=n-i,i=0,1,2...(n-1),数据移动次数是Mi=3Ci
所以比较次数总数Cmax=n(n-1)/2
移动次数总数Mmax=3Cmax=3n(n-1)/2
总次数为Cmax+Mmax=2n(n-1)
所以冒泡排序最坏的时间复杂度是O(n2)
综上,因此冒泡排序总的平均时间复杂度为O(n2)。
下面给出C#的通用冒泡排序算法:
startIndex为排序区间的数组元素下标,通常为0,
endIndex为排序区间的数组元素下标,通常为array.Length-1
public class BubbleSort<T> where T : IComparable<T> { public void Sort(T[] array, int startIndex, int endIndex) { bool isMoved = false; for (int i = endIndex; i >= startIndex; i--) { for (int j = startIndex; j < i; j++) { if (array[j].CompareTo(array[j + 1]) > 0) { T v = array[j + 1]; array[j + 1] = array[j]; array[j] = v; isMoved = true; } } if (isMoved == false) break; } } }
作者:Andy Zeng
欢迎任何形式的转载,但请务必注明出处。
http://www.cnblogs.com/andyzeng/p/3683899.html