冒泡排序

冒泡排序Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

 

冒泡排序算法的运作如下:(从后往前)

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

  3. 针对所有的元素重复以上的步骤,除了最后一个。

  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

 

bubble

时间复杂度

若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数 C和记录移动次数 M均达到最小值:

所以,冒泡排序最好的时间复杂度
若初始文件是反序的,需要进行

趟排序。每趟排序要进行

次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:

冒泡排序的最坏时间复杂度为

综上,因此冒泡排序总的平均时间复杂度为

算法稳定性

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

 

C#实现代码:

 

//冒泡排序
        public static int[] bubble(int[] data)
        {
            int temp = 0;
            for (int i = data.Length; i > 0; i--)
            {
                for (int j = 0; j < i - 1; j++)
                {
                    if (data[j] > data[j + 1])
                    {
                        temp = data[j];
                        data[j] = data[j + 1];
                        data[j + 1] = temp;
                    }
                }
            }

            return data;
        }

 

private void btn_sort_Click(object sender, EventArgs e)
        {
            int[] before;
            string data = Tb_before.Text.ToString();
            string[] dataSting = data.Split(new char[] { ',' });

            //string[]转换int[]
            before = Array.ConvertAll<string,int>(dataSting,                 
                delegate(string s){
                    return int.Parse(s);
            });

            //int[] before = new int[dataString.Length];
            //for (int i = 0; i < dataString.Length; i++)
            //{
            //    before[i] = Convert.ToInt32(dataString[i]);
            //}

            //调用排序方法
            before = Sort.bubble(before);

            //显示结果
            StringBuilder after = new StringBuilder();
            for (int i = 0; i < before.Length; i++)
            {
                after.Append(before[i] + ",");
            }
            Tb_after.Text = after.ToString();            
        }
项目代码

 

image

posted @ 2015-12-21 21:27  致林  阅读(251)  评论(0编辑  收藏  举报