数据结构:排序(1)

王争数据结构11笔记

1、冒泡排序、插入排序、选择排序是基于比较的排序。时间复杂度为O(n^{2})

2、快排,归并排序也是基于比较的排序。时间复杂度为O(nlogn)

3、桶排序、计数排序、基数排序不是基于比较的排序,其时间复杂度为O(n)

4、冒泡排序BS:一次冒泡会让至少一个元素移动它应该在的位置,重复n次之后就完成了n个数据的排序工作。

    每次冒泡就是把从左至右的数据中第一个相邻关系发生异常的数据摆放到正确的位置的过程,其余的顺序保持不变。当某一次冒泡操作已经没有数据交换时,说明完全有序,不需要再执行后续冒泡操作。

void bubbleSort(int a[], int n){
    if (n<=1) return;
    for(int i=0;i<n;++i){
      //提前退出冒泡循环的标志位
      bool flag=false;
      for(int j=0;j<n-i-1;++j)
      {  
         if(a[j]>a[j+1]){
           int tmp=a[j];
           a[j]=a[j+1];
           a[j+1]=tmp;
           flag=true;
        }

      }
      if(!flag) break;
    
    }

}

 

5、冒泡排序只涉及相邻数据交换操作,常量级临时空间,空间复杂度O(1),原地排序算法。

相同大小的数据再排序前后顺序不变,因此冒泡排序为稳定的排序算法

时间复杂度计算:最好情况:一次冒泡,即O(n)。最坏情况:n次冒泡,即O(n^{2})。平均情况下需要n*(n-1)/4的交换操作,平均情况下的时间复杂度为O(n^{2})

---------------------------------------------------------------------------分割线---------------------------------------------------------------------------

插入排序

6、将数组中的数据分为两个区间,已排序区间和未排序区间。初始已排序区间只有一个元素,就是数组的第一个元素。插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入并保证已排序区间数据抑制有序。

7、插入排序包括两种操作,一种是元素比较,一种是元素移动。插入排序的移动次数等于逆序度。

void inserttionSort(int a [], int n)
{
  if(n<=1) return;
  for (int i=1;i<n;++i)
  {
     int value=a[i];
     int j=i-1;
     //查找插入的位置
     for(;j>=0;--j)
     {
       if(a[j]>value)
       {
         a[j+1]=a[j];//move
       }
       else
       {
          break;
       }
      } 
    a[j+1]=value;//insert
   }
       
} 
    













}

 

8、插入排序是原地排序算法,空间复杂度为O(1);插入排序是稳定的排序算法;插入排序的时间复杂度O(n^{2})

---------------------------------------------------------------------------分割线---------------------------------------------------------------------------

选择排序

9、选择排序每次从未排序区间中找到最小的元素,将其放到已排序区域的末尾。

10、选择排序的空间复杂度为O(1)。是一种原地排序算法。

11、选择排序的最好情况时间复杂度、最坏情况和平均情况时间复杂度为O(n^{2})

12、选择排序是一种不稳定的排序算法,其每次都要找剩余未排序元素中的最小值,并和前面的元素交换位置,这会破坏稳定性。

---------------------------------------------------------------------------分割线---------------------------------------------------------------------------

13、冒泡排序无论如何优化,元素交换的次数是原始数据的逆序度。插入排序同样如此,不管怎么优化,元素移动的次数等于原始数据的逆序。

14、冒泡排序的数据交换需要3个赋值操作,而插入排序只需1个。因此,如果希望把性能做到极致,应该首选插入排序。

15、三种排序方法的时间复杂度为O(n^{2})。冒泡和选择实战中使用很少,插入排序较为使用。对于大规模数据排序问题,三种方法时间复杂度较高,更倾向于用O(nlogn)的排序算法。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值