王争数据结构11笔记
1、冒泡排序、插入排序、选择排序是基于比较的排序。时间复杂度为。
2、快排,归并排序也是基于比较的排序。时间复杂度为
3、桶排序、计数排序、基数排序不是基于比较的排序,其时间复杂度为
4、冒泡排序BS:一次冒泡会让至少一个元素移动它应该在的位置,重复n次之后就完成了n个数据的排序工作。
每次冒泡就是把从左至右的数据中第一个相邻关系发生异常的数据摆放到正确的位置的过程,其余的顺序保持不变。当某一次冒泡操作已经没有数据交换时,说明完全有序,不需要再执行后续冒泡操作。
void bubbleSort(int a[], int n){
if (n<=1) return;
for(int i=0;ia[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次冒泡,即。平均情况下需要n*(n-1)/4的交换操作,平均情况下的时间复杂度为。
---------------------------------------------------------------------------分割线---------------------------------------------------------------------------
插入排序
6、将数组中的数据分为两个区间,已排序区间和未排序区间。初始已排序区间只有一个元素,就是数组的第一个元素。插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入并保证已排序区间数据抑制有序。
7、插入排序包括两种操作,一种是元素比较,一种是元素移动。插入排序的移动次数等于逆序度。
void inserttionSort(int a [], int n)
{
if(n<=1) return;
for (int i=1;i=0;--j)
{
if(a[j]>value)
{
a[j+1]=a[j];//move
}
else
{
break;
}
}
a[j+1]=value;//insert
}
}
}
8、插入排序是原地排序算法,空间复杂度为O(1);插入排序是稳定的排序算法;插入排序的时间复杂度
---------------------------------------------------------------------------分割线---------------------------------------------------------------------------
选择排序
9、选择排序每次从未排序区间中找到最小的元素,将其放到已排序区域的末尾。
10、选择排序的空间复杂度为O(1)。是一种原地排序算法。
11、选择排序的最好情况时间复杂度、最坏情况和平均情况时间复杂度为
12、选择排序是一种不稳定的排序算法,其每次都要找剩余未排序元素中的最小值,并和前面的元素交换位置,这会破坏稳定性。
---------------------------------------------------------------------------分割线---------------------------------------------------------------------------
13、冒泡排序无论如何优化,元素交换的次数是原始数据的逆序度。插入排序同样如此,不管怎么优化,元素移动的次数等于原始数据的逆序。
14、冒泡排序的数据交换需要3个赋值操作,而插入排序只需1个。因此,如果希望把性能做到极致,应该首选插入排序。
15、三种排序方法的时间复杂度为。冒泡和选择实战中使用很少,插入排序较为使用。对于大规模数据排序问题,三种方法时间复杂度较高,更倾向于用的排序算法。