一、冒泡排序
介绍:
template<typename T>
void BubbleSort( T data[], int n)
{
bool flag=true; //用来确保数组一旦有序立即跳出,省去多余比较
for(int i=1; i<n && flag; i++) //加入标志位为true的条件
{
flag = false; //默认false
for(int j=0; j<n-i; j++)
{
if(data[j] > data[j+1])
{
flag = true; //存在逆序,更新标志位
swap(data[j],data[j+1]); //默认的swap函数
}
}
}
}
复杂度分析:
冒泡排序最好的情况就是当待排序序列正序排列的时候,
则只需要进行一趟排序,在排序过程中进行n-1次比较,
而不需要移动记录,即外层for循环只需执行一次,
此时复杂度为O(n).最坏的情况就是逆序排列的时候,
则第i趟需要进行n-i次比较,3(n-i)次移动,
即外层for循环与内层for循环都得执行,
总的比较次数为n(n-1)/2,
而移动次数为3n(n-1)/2,
此时复杂度为O(n*n).
二、快速排序
介绍:
/*递归—快速排序函数*/
void qsort(int a[],int low,int high){
if(low<high){
int pos=qk(a,low,high);
qsort(a,low,pos-1);
qsort(a,pos+1,high);
}
}
//注意快速排序函数的参数,因为每一趟快速排序的作用是要将数组分割为两个部分,
//前面一部分不大于x,后面一部分不小于x,然后再
//对前一部分和后一部分继续进行快速排序,所以,qk的第二个参数与第三个参数应为low与high
int qk(int a[],int low,int high){
int x=a[low];
//选取第一个元素作为基准记录
while(low<high){
while(low<high && a[high]>=x)
high--;
if(low<high){
a[low]=a[high];
low++;
}
while(low<high && a[low]<=x)
low++;
if(low<high){
a[high]=a[low];
high--;
}
}
a[low]=x;
return low;
}
时间和空间复杂度:
类型 | 算法 | 时间复杂度 | 空间复杂度 | 稳定性 | ||
平均 | 最优 | 最差 | ||||
交换排序 | 冒泡排序 | O(n2) | O(n) | O(n2) | 最优O(0),最差O(n) | 稳定 |
快速排序 | O(nlogn) | O(nlogn) | O(n2) | 最优O(logn),最差O(n) | 不稳定 |