经典排序算法之冒泡排序、选择排序、插入排序 c++

排序算法是编程学习的基础,而 冒泡排序 选择排序 插入排序 对于小型数组效率高,但是对于大型的数据效率就比较差了。

1.冒泡排序

顾名思义,冒泡排序就是将满足条件的数据从前向后平移。
例如定义数组 a[]={9,4,7,5,8,6,2,3,1};
伪代码:
1.将数组第一个与第二个比较,若比后面的大,交换。
2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。(这是一趟重复)
3.针对所有的元素重复以上的步骤,除了最后一个。

代码演示:


void bubble(int a[], int n)  //每趟的代码 
{
    int i;                 
    for(i=0; i<n; i++)
    {
        if(a[i]>a[i+1])     //后面的比前面的大,就交换
        {
            int temp=a[i];    //经典交换方法
            a[i] = a[i+1];
            a[i+1] = temp;
        }
    }
}

下面重复每趟

void bubble_sort(int a[], int n)
{
    int i;
    for(i=n; i>0; i--)
    {
        bubble(a , i);
    }
}

2.选择排序

选择排序:先选择,后排序。
以从小到大排序为例,建立数组每次找到数组最大的然后与最后一个交换,接下来选择数组第二大的排在第二位。

代码演示
选择:

int select(int a[],int n)    //每次选择数组n个之前的最大的数字,并返回这个数字的位置
{
    int max=0;
    int pos=0;
    for(int i=0; i<n; i++)
    {
        if(max<a[i])
        {
            max=a[i];
            pos=i;
        }
    }
    return pos;
}

排序:

void selectsort(int a[], int n)
{
    int i = n;        //从最后一个开始选择
    while(i>0)
    {
        int pos=select(a,i);
        int temp = a[pos];
        a[pos]=a[i-1];
        a[i-1] = temp;
        i--;          //每次减一,继续选择之前的数
    }
}

3.插入排序

也是以从小到大排序为例,从后往前找寻数组中比他小的数,并将比他大的数向后排序,将其插入在比他小的位置后面。

插入

void insert(int a[], int n){
    int i=n;
    int key=a[n]; 
    while(a[i-1]>key)
    {
        a[i]=a[i-1];
        i--;
        if(i == 0)
            break;
    }
    a[i]=key;
}

重复以上步骤:

void insertsort(int a[], int n)
{
    for(int i=1; i<n; i++)
    {
        insert(a , i);
    }
}

一下是全部c++代码并写了测试函数:

#include <iostream>
using namespace std;

void bubble(int a[], int n)
{
    int i;
    for(i=0; i<n; i++)
    {
        if(a[i]>a[i+1])
        {
            int temp=a[i];
            a[i] = a[i+1];
            a[i+1] = temp;
        }
    }
}

void bubble_sort(int a[], int n)
{
    int i;
    for(i=n; i>0; i--)
    {
        bubble(a , i);
    }
}

int select(int a[],int n)
{
    int max=0;
    int pos=0;
    for(int i=0; i<n; i++)
    {
        if(max<a[i])
        {
            max=a[i];
            pos=i;
        }
    }
    return pos;
}

void selectsort(int a[], int n)
{
    int i = n;
    while(i>0)
    {
        int pos=select(a,i);
        int temp = a[pos];
        a[pos]=a[i-1];
        a[i-1] = temp;
        i--;
    }
}

void insert(int a[], int n){
    int i=n;
    int key=a[n];
    while(a[i-1]>key)
    {
        a[i]=a[i-1];
        i--;
        if(i == 0)
            break;
    }
    a[i]=key;
}

void insertsort(int a[], int n)
{
    for(int i=1; i<n; i++)
    {
        insert(a , i);
    }
}

int main()
{
    int a1[]={9,6,5,7,4,1,2,3,8};
    int a2[]={9,6,5,7,4,1,2,3,8};
    int a3[]={9,6,5,7,4,1,2,3,8};
    cout<<"未经过排序的数组:";
    for(int i=0; i<9; i++)
        cout<<a1[i]<< " ";
    cout<<endl;
    bubble_sort(a1,9);
    cout<<"冒泡排序法:";
    for(int i=0; i<9; i++)
        cout<<a1[i]<< " ";
    cout<<endl;
    selectsort(a2,9);
    cout<<"选择排序法:";
    for(int i=0; i<9; i++)
        cout<<a2[i]<< " ";
    cout<<endl;
    insertsort(a3,9);
    cout<<"插入排序法:";
    for(int i=0; i<9; i++)
        cout<<a3[i]<< " ";
    cout<<endl;
    return 0;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值