冒泡排序
1、冒泡排序思想:
根据大小交换相邻的两个元素的位置,从后向前(或是从前向后)一直将相邻的两个元素进行交换,
直到最大或是最小的元素处于数组的最左边或是最右边(这看你是按哪种大小顺序进行排序).
2、时间复杂度:
(1)、算法的最好时间复杂度
若文件的初始状态是正序的,一趟扫描即可完成排序.所需的关键字比较次数C和记录移动次数M均达到最小值:
Cmin=n-1
Mmin=0。
冒泡排序最好的时间复杂度为O(n.。
(2)、算法的最坏时间复杂度
若初始文件是反序的,需要进行n-1趟排序。每趟排序要进行n-i次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置.在这种情况下,比较和移动次数均达到最大值:
Cmax=n(n-1)/2=O(n2)
Mmax=3n(n-1)/2=O(n2)
冒泡排序的最坏时间复杂度为O(n2).
(3)、算法的平均时间复杂度为O(n2)
虽然冒泡排序不一定要进行n-1趟,但由于它的记录移动次数较多,故平均时间性能比直接插入排序要差得多.
3、例子说明
10,20,30,40,50,60,70 将这七个数按从大到小排序
10,20,30,40,50,60,70 原始数据7个元素
20,30,40,50,60,70,10 第1趟 比较6次
30,40,50,60,70,20,10 第2趟 比较5次
40,50,60,70,30,20,10 第3次 比较4次
50,60,70,40,30,20,10 第4次 比较3次
60,70,50,40,30,20,10 第5次 比较2次
70,60,50,40,30,20,10 第6次 比较1次
也就是n个元素需要排n-1趟
第t趟比较的次数为n-t次
给出一组数字,将这一组数字按从小到大的顺序排序.
代码如下:
namespace 冒泡排序
{
class Program
{
static void Main(string[] args)
{
int[] score = { 4,6,4,6,3,754,6,7,3,54,5,44,9};
for (int i = 0; i < score.Length - 1; i++)//控制比较的趟数,这个循环一次表示比较了一趟
{
for (int j = 0; j < score.Length - i - 1; j++)//控制比较次数
{
if (score[j] > score[j + 1])//两两比较
{
//符合条件前后两数字交换
int temp = score[j];
score[j] = score[j + 1];
score[j + 1] = temp;
}
}
}
Console.WriteLine("从小到大排序为:");
for (int i = 0; i < score.Length; i++)
{
Console.Write(score[i]+" ");
}
Console.ReadKey();
}
}
}