c# 第20节 一维数据的冒泡排序

本节内容:

1:冒泡排序说明:

2:冒泡排序实现:

3:冒泡排序的时间复杂度

1:冒泡排序说明:

冒泡排序也是最简单最基本的排序方法之一。冒泡排序的思想很简单,就是以此比较相邻的元素大小,将小的前移,大的后移,就像水中的气泡一样,最小的元素经过几次移动,会最终浮到水面上。

举例分析说明一下,如下数据:

2 7 4 6 9 1 首先比较最后两个数字,发现1比9小,于是前移

2 7 4 6 1 9 然后比较6和1

2 7 4 1 6 9 继续前移,然后是4和1

2 7 1 4 6 9 7和1比较

2 1 7 4 6 9 2和1

1 2 7 4 6 9 至此,第一趟冒泡过程完成,最小的元素1被移到第一个,不再参与后面的排序过程。下一趟冒泡过程同理,比较6和9,以此类推,最终得到结果。

代码

复制代码
        cout << "bubble sort:" << endl;
printline("before sort:", v);
for (int i=0; i<v.size(); i++){
int temp = 0;
for(int j=v.size()-1; j>0; j--){
if (v[j] < v[j-1]){
temp = v[j];
v[j] = v[j-1];
v[j-1] = temp;
}
}
}
printline("after sort:",v);
复制代码

2:冒泡排序实现:

 class Program
    {
        static void Main(string[] args)

        {

            int[] num1 = { 34, 11, 3, 4, 67, 8 };
            for (int j = 0; j < num1.Length;j++ ) //一共进行n个元素-1次
            { 
                for (int i = 0; i < num1.Length - 1-j; i++)  //内循环的长度应该是一共循环的长度,减去已经排序好的
                {
                
                    if (num1[i]<num1[i+1]){     //进行升序排序,每次都是当前i跟下一次i的比较
                        int temp = num1[i];
                        num1[i] = num1[i + 1];
                        num1[i + 1] = temp;
                    }

                }

            }

            foreach (int item in num1) { Console.WriteLine(item); }


            Console.ReadKey();
        }
    }

3:冒泡算法复杂度

  1. 时间复杂度:O(n^2)

冒泡排序耗时的操作有:比较 + 交换(每次交换两次赋值)。时间复杂度如下:

1)        最好情况:序列是升序排列,在这种情况下,需要进行的比较操作为(n-1)次。交换操作为0次。即O(n)

2)        最坏情况:序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。交换操作数和比较操作数一样。即O(n^2)

3)        渐进时间复杂度(平均时间复杂度):O(n^2)

  1. 空间复杂度:O(1)

从实现原理可知,冒泡排序是在原输入数组上进行比较交换的(称“就地排序”),所需开辟的辅助空间跟输入数组规模无关,所以空间复杂度为:O(1)

 

(三)稳定性

冒泡排序是稳定的,不会改变相同元素的相对顺序。

原文地址:https://www.cnblogs.com/hero799/p/8662302.html