目录
冒泡排序(BubbleSort)
每一轮一次交换相邻两个元素,使最大的元素放到队尾,因似气泡在水中浮起,所以名叫冒泡排序
最好情况的时间复杂度:O(n)
最坏情况的时间复杂度:O(n^2)
平均时间复杂度:O(n^2)
空间复杂度:O(1)
稳定性:稳定
模拟算法
先列举一个数组:
5 3 4 6 1 2
一次交换后:
3 4 5 1 2 6
两次交换后:
3 4 1 2 5 6
三次交换后:
3 1 2 4 5 6
四次交换后:
1 2 3 4 5 6
五次运行后发现无交换,所以排列有序,结束。
代码
for (int i = 1; i <=n-1; i ++ )
{//控制每次循环的次数
for (int j = 1; j <= n-i; j ++ )
{//从前往后比较相邻两个元素
if (a[j] > a[j + 1])
{//如果前面的大于后面的
swap(a[j],a[j+1]);//交换
}
}
}
}
优化后的代码:
for (int i = 1; i <=n-1; i ++ )
{//控制每次循环的次数
bool flag =false;
for (int j = 1; j <= n-i; j ++ )
{//从前往后比较相邻两个元素
if (a[j] > a[j + 1])
{//如果前面的大于后面的
swap(a[j],a[j+1]);//交换
flag=true;
}
}
if(!flag) break;//如果无交换,则说明数组有序,无需继续
}
计数排序(CountSort)
输入待排序的数组后,将其按照数字范围定义的数组下标加一,最后按顺序输出数组(下标为几就输出几个)
时间复杂度:O(n+k)
空间复杂度:O(k)
稳定性:稳定
代码
for(int i=1;i<=n;i++)
{
int k;
cin>>k;//输入待排序列中的值
b[k]++;//将数组b中下标k的元素值加1
}
for(int i=0;i<=100;i++)//数组b按照下标由小到大访问
{
while(b[i]>0)//如果第i个元素的值不为0,则输出下标i
{
cout<<i<<' ';
b[i]--;
}
}
说明
当数列最大最小值差距过大时,并不适用于计数排序
当数列元素不是整数时,并不适用于计数排序
因此计数排序并不适用于大部分情况。