桶排序
对n个0-100的数字进行从小到大的排序。
#include<iostream>
int main()
{
int a[1001], n, num;
//1.将数组中的值赋值为0
for(int i=0; i<1001; i++)
a[i] = 0;
//2.输入数字个数
scanf("%d", &n);
//3.输入n个数字,统计每个数字出现的次数
for(int i=0; i<n; i++)
{
scanf("%d",&num);
a[num]++;
}
//4.将数字按照从小到大的顺序及其出现的次数打印出来
for(int i=0; i<1001; i++)
{
for(int j=1; j<=a[i]; j++)
{
printf("%d ",i);
}
}
return 0;
}
结果如下所示:
桶排序不能解决形如:haha 55, sansha 86, ruyi 97这样带人名的排序。其时间复杂度为O(N+M)。
冒泡排序
冒泡排序弥补了桶排序的不足。其基本思想为:每次比较相邻的两个元素,顺序错误就把它们交换过来。
#include<bits/stdc++.h>
using namespace std;
struct student
{
char name[21];
int score;
} ;
int main()
{
//1.输入元素个数
int n;
scanf("%d",&n);
//2.创建具有n+1个元素的结构体数组,输入n个元素
struct student a[n+1];
for(int i=1; i<=n; i++)
{
scanf("%s %d",a[i].name,&a[i].score);
}
//3.对分数进行冒泡排序
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n-i; j++)
{
if(a[j].score<a[j+1].score)
{
swap(a[j],a[j+1]);
}
}
}
//4.输出分数降序排列对应的名字
for(int i=1; i<=n; i++)
printf("%s\n",a[i].name);
return 0;
}
验证如下图:
冒泡排序的核心是双层嵌套循环。其时间复杂度为:O(N^2)。
快速排序
其平均时间复杂度为0(NlogN)。
#include<iostream>
using namespace std;
int a[101], temp;
void quickSort(int left, int right)
{
if(left > right)
return;
int i=left, j=right;
temp = a[left];//temp为基准数
while(i!=j)
{
//从右至左寻找小于基准数的数
while(a[j]>=temp && i<j)
j--;
//从左至右寻找大于基准数的数
while(a[i]<=temp && i<j)
i++;
//将大数放在右边,小数放在左边
if(i<j)
swap(a[i],a[j]);
}
//当i=j时,交换a[i]与基准数temp的位置
a[left] = a[i];
a[i] = temp;
//开始子序列的快速排序
quickSort(left, i-1);
quickSort(i+1, right);
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
quickSort(1,n);
for(int i=1;i<=n;i++)
printf("%d ",a[i]);
return 0;
}