四种排序(选择排序、冒泡排序、快速排序和插入排序)
- 选择排序:
- 完整代码:
- 运行结果:
- 冒泡排序:
- 完整代码:
- 运行结果:
- 插入排序:
- 完整代码:
- 运行结果:
- 快速排序
- 代码
- 运行结果
平常我们一般都用选择排序、冒泡排序、快速排序和插入排序,今天我们就来讲讲吧!
选择排序:
思路:假设最大值的下标是0,然后与后面进行比较找出未排序的最大值下标,判断是否为没比较好的最后一位,不是,就与没比较好的最后一位交换
for(i=1;i<n;i++)
{
ma=0;//假设最大值的下标是0
for(j=1;j<=n-i;j++)//找出未排序的最大值下标
{
if(a[j]>a[ma])
{
ma=j;
}
}
if(ma!=n-i)
{
swap(a[n-i],a[ma]);//是否为没比较好的最后一位,不是,就与没比较好的最后一位交换
}
}
完整代码:
//选择排序
#include<bits/stdc++.h>
using namespace std;
int main() {
int i,j,n,ma=0,a[105];
cin>>n;
for(i=0; i<n; i++) {
cin>>a[i];
}
for(i=1; i<n; i++) {
ma=0;
for(j=1; j<=n-i; j++) {
if(a[j]>a[ma]) {
ma=j;
}
}
if(ma!=n-i) {
swap(a[n-i],a[ma]);
}
}
for(int i=0; i<n; i++) {
cout<<a[i]<<" ";
}
return 0;
}
运行结果:
冒泡排序:
思路:每个数与后面的那个数比较,直到没排过序的最后那一个(n-i,i轮数)
for(i=1; i<=n-1; i++) {//i控制轮数
for(j=0; j<=n-1-i; j++) {//将每一次比较以后的最大值后移一位
if(c[j]>c[j+1]) {
swap(c[j],c[j+1]);
}
}
}
完整代码:
//冒泡排序
#include<bits/stdc++.h>
using namespace std;
int n,j,i;
int c[1110];
int main() {
cin>>n;
for(i=0; i<n; i++) {
cin>>c[i];
}
for(i=1; i<=n-1; i++) {
for(j=0; j<=n-1-i; j++) {
if(c[j]>c[j+1]) {
swap(c[j],c[j+1]);
}
}
}
for(i=0; i<n; i++) {
cout<<c[i]<<" ";
}
return 0;
}
运行结果:
插入排序:
思路:先找出合适的位置,在将数组往后放,将找到合适的位置数据放到第一个
for(i=1; i<n; i++)
{
for(j=0; j<i; j++)
{
if(a[i]<=a[j]) break;//找合适的位置
}
if(j!=i)
{
t1=a[i];
for(k=i-1; k>=j; k--)
{
a[k+1]=a[k];
}
a[j]=t1;//插入
}
}
完整代码:
//插入排序
#include<bits/stdc++.h>
using namespace std;
int main() {
int i,j,n,l,k;
double a[105],t1;
cin>>n;
for(i=0; i<n; i++) {
cin>>a[i];
}
for(i=1; i<n; i++)
{
for(j=0; j<i; j++)
{
if(a[i]<=a[j]) break;
}
if(j!=i)
{
t1=a[i];
for(k=i-1; k>=j; k--)
{
a[k+1]=a[k];
}
a[j]=t1;
}
}
for(i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
运行结果:
快速排序
我们画图来讲一讲吧!
1.随意列出10个无序的数字,需要用到i,j两个变量,i在这列数的最左边,j在这列数的最右边,在这列数中将一个数设置基准值(大家可以不设第一个数为基准值),首先让j向左移动,让i向右移动。
2.j找到一个比基准值小的数2停下来,然后i向右移动找到比基准值大的数6停下来,然后将i,j所指向的数进行交换。
3.交换后,j继续向左移动找到比基准值小的数4停下来,然后i向右移动找到比基准值大的数7停下来,然后将i,j所指向的数进行交换。
4.接下来j继续向左移动找到比基准值小的数3,i向右移动和j碰面,此时i和j在同一个位置上停下来,此时将i和j所指向的数和基准值进行交换,即将3和5进行交换。
5.即基准值归位后,基准值左边的都是小于基准值5的数,在基准值右边的都是大于基准值5的数。
(以此类推)
代码
#include<bits/stdc++.h>
using namespace std;
int n,a[100],i,j;
void qp(int l,int r) {
i=l;
j=r;
if(l>=r)return ;
while(i!=j) {
while(a[j]>=a[l]&&i<j)j--;
while(a[i]<=a[l]&&i<j)i++;
if(i<j)swap(a[i],a[j]);
}
swap(a[l],a[i]);
qp(l,i-1);
qp(i+1,r);
}
int main() {
cin>>n;
for(int i=0; i<n; i++)cin>>a[i];
qp(0,n-1);
for(int i=0; i<n; i++)cout<<a[i]<<' ';
return 0;
}
运行结果
(完整代码适用于1010- 数组元素的排序)
再见,记得三连哦!