冒泡排序
 
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();
        }
    }
}
 
posted on 2013-05-29 22:16  伊人撩月  阅读(340)  评论(0编辑  收藏  举报