您的位置:首页 > 其它

基于比较的算法之一:冒泡排序

2014-04-23 20:58 134 查看
冒泡排序是基于比较的排序中比较基本的算法。

以升序排序目的为例,算法的中心思想是从头至尾的比较两两相邻的元素,如果发现有反序(决定了稳定性)的则交换两个相邻元素。完成第一趟比较后最大的元素放到了最末端。

第二趟从头至尾的比较不用比较最后一个元素(最大元素已经在最末端正确位置),所以比第一次少比较了一个元素,这趟比较完成后,第二个元素到达正确位置。

持续进行这样的操作,直到只剩下最后一个最小元素被放到了第一个位置,排序完成。

假设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

欢迎任何形式的转载,但请务必注明出处。

/article/5796325.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: