冒泡排序
原理: 从左到右,相邻元素进行比较,按照排序要求进行位置交换。每次比较一轮,就会确定好序列中最大或最小的一个数。这个数就会从序列的最右边冒出来。
- 随机给出一组数字,降序输出这组数字。
- 采用双重for循环,外层循环枚举气泡的位置:n-2;
- 内层循环未排序的数据:i-1
- swap(a,b) 内置的交换函数
#include<bits/stdc++.h>
using namespace std;
int main(){ //降序
int n;
cin>>n;
int a[100];
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=n;i>=2;i--)
{
for(int j=1;j<=i-1;j++)
{
if(a[j]<a[j+1])
{
swap(a[j],a[j+1]);
}
}
}
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
上面的方法不管数组什么时候已经排好序,都要n-1次才能排完,可以设置一个布尔变量,如果遍历某次不再有数据交换,证明数组已经有序,则不再进行比较,进而减少几趟排序。
#include<bits/stdc++.h>
using namespace std;
int main(){ //降序
int n;
cin>>n;
int a[100];
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=n;i>=2;i--)
{
bool flag=true; //定义布尔型变量进行标记
for(int j=1;j<=i-1;j++)
{
if(a[j]<a[j+1])
{
flag=false;
swap(a[j],a[j+1]);
}
}
if(flag==true) //如果遍历某次不再有数据交换,证明已经有序,则可以退出循环
{ break;
}
}
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
选择排序
原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。即每次选择最大或最小的数放好
- 双重循环,外循环定位到还没定下来的宽度/位置
- 内循环遍历比较还没确定位置的数
- 先让第一个数作为最大(小)的数,再去进行比较
#include<iostream>
using namespace std; //升序,从小到大
int main()
{
int a[100];
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n-1;i++)
{
int min=i;
for(int j=i+1;j<=n;j++)
{
if(a[j]<a[min]){
min=j;
}
}
if(a[i]!=a[min])
{
int temp=a[i];
a[i]=a[min];
a[min]=temp;
}
}
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
插入排序
- 从第一个元素开始,该元素可以认为已经被排序。
- 取出下一个元素,在已经排序的元素序列中从后向前扫描。
- 如果该元素(已排序)大于新元素,将该元素移到下一位置。
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置。
- 将新元素插入到该位置后。
- 重复步骤2~5。
#include<iostream>
using namespace std;
int main() // 从小到大排
{
int n;
int a[100];
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=2;i<=n;i++)
{
int key = a[i];
int j = i - 1;
while (j >= 1 && a[j] > key) {
a[j + 1] = a[j];
j = j - 1;
}
a[j + 1] = key;
}
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
桶排序
桶排序(Bucket sort):如果需要排序的数据在一个明显有限范围内(整型)时,我们可以用数组下标与数值一一对应,将每个数值放进与它对应的数组元素(桶)中,然后按照顺序输出各桶的值,将得到有序的序列。
有n个正整数,数字范围在1~10000之间,请你将这n个数字从小到大输出。
【输入描述】第一行一个正整数n,接下来一行n个数字。(n不超过500000) 【输出描述】从小到大输出这n个数字,【输入样例】5 2 3 4 6 3 【输出样例】23346
#include<bits/stdc++.h>
using namespace std;
int a[10001]; //定义足够长的数组长度
int main(){
int n,t; // n为有多少个数,t为输入的具体数字
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>t;
a[t]++;
}
for(int i=1;i<=10000;i++) //遍历整个数组,上限是题目要求的数字的最大范围
for(int j=1;j<=a[i];j++)
{
cout<<i<<" ";
}
return 0;
}
学校推出10名歌手,校学生会想知道这10名歌手受欢迎的程度,设计一个投票箱,让每一个同学给自己喜欢的歌手投票,为了方便,校学生会把10名歌手用1-10进行编号,这样,同学们只要用编号进行投票,现在校学生会找到你,让你帮忙统计一下每个歌手获得的票数。
【输入】两行,第一行是一个整数n,表示参加投票的人数,第二行是n个整数,每个数的取值的范围为[1-10],表示喜欢的歌手【输出】两行,第一行为1-10个数字,表示选手编号,第二行10个数字表示各个选手获得的票数
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int t;
int a[11]={0};
for(int i=1;i<=n;i++)
{
cin>>t;
a[t]++;
}
cout<<"1 2 3 4 5 6 7 8 9 10"<<endl;
for(int i=1;i<=10;i++){
cout<<a[i]<<" ";
}
return 0;
}