1.桶排序
优点
桶排序算是最好写的算法,对于数据规模较小的数据,桶排序可以很快的实现排序
局限:
对于空间范围跨度较大的数据时,对空间的浪费就会很大,即使里面只有几个元素,但是空间跨度范围才是空间的真正大小
基本原理:
桶排序相当于把每一个数值当做一个桶,没存在一个数值则向里面加一,再通过桶内存放的数量来控制输出,如数量为0不输出,数量为2时该值输出两次
参考代码:
//排序算法之桶排序
#include<iostream>
using namespace std;
//控制数据规模
const int N=1000;
int f[N];
int main()
{
// 控制输入个数
int n,t;
cin>>n;
// 输入
for(int i=0;i<n;i++)
{
cin>>t;
f[t]++;
}
// 输出
for(int j=0;j<N;j++)
{
if(f[j])
{
for(int i=0;i<f[j];i++)
{
cout<<j<<" ";
}
}
}
}
2.冒泡排序
冒泡排序基本上是每一位刚接触排序算法的C语言学习者最先接触到的算法
基本原理:
每次检查相邻的两个元素,按照一定的规则进行交换(如升序排序),每进行完一次交换都会选出一个最大值放到最后;交换的次数取决于数据量
优点:
冒泡排序代码简单易于排序,相较于上面说到的桶排序,它避免了数组范围跨度大当数据数量较小而引起的空间浪费的尴尬局面,但是因为冒泡排序需要根据数据的规模决定交换的次数,所以相应的时间复杂度较高
使用范围:
适用于数据跨越范围较大,数据数量较小的情况
参考代码:
//冒泡排序
#include<iostream>
using namespace std;
int f[100];
int main()
{
int n,t;
// 输入
cin>>n;
for(int i=0;i<n;i++)
{
cin>>f[i];
}
// 开始排序
for(int i=n-1;i>1;i--)
{
for(int j=0;j<i;j++)
{
if(f[j]>f[j+1])
{
// 引入中间变量交换值
t=f[j];
f[j]=f[j+1];
f[j+1]=t;
}
}
}
// 输出
for(int i=0;i<n;i++)
{
cout<<f[i]<<" ";
}
}
3.快速排序
基本思想:
1.选定中心轴P(默认第一个)
2.将大于P的数字放到P的右边
3.将小于P的数字放到P的左边
4.分别对左右子序列重复前三步操作
!!注意要从右边开始
#include<iostream>
#include<algorithm>
using namespace std;
void quicksort(int arry[], int l, int r)
{
//结束条件
if (l >= r)
return;
//给定初始指
int left = l, right = r;
//设定中心轴p值
int p = arry[left];
//left<right确保左右指针没有相遇
while (left < right)
{
//移动右指针直到不再大于中心轴
while (left < right && arry[right] >= p)
{
right--;
}
//将右指针的值传递给左指针
if (left < right)
{
arry[left] = arry[right];
}
//移动左指针直至不再小于中心轴
while (left < right && arry[left] <= p)
{
left++;
}
//将左指针的值传递给右指针
if (left < right)
{
arry[right] = arry[left];
}
//相遇以后将值赋值为p
if (left == right)
{
arry[left] = p;
}
}
//分区重新排序
//左区
quicksort(arry, l, right - 1);
//右区
quicksort(arry, right + 1, r);
}