c语言 冒泡,插入,选择排序

冒泡排序

//冒泡排序
/*
每两个数之间做比较:较大的数放到右边,循环下去;就能够把最大的数字换到数组最后面
然后数组长度--
再两个数之间作比较。。。。。 
*/ 

void bubble(int a[],int n)
{
    for(int i=0;i<n-1;i++)//注意a[n-1]为数组的最后一项,没有数字和他做比较,故i<n-1 
    {
        if(a[i]>a[i+1])
            a[i]=a[i]+a[i+1]-(a[i+1]=a[i]);
    }
}
void bubbleSort(int a[],int n)
{
    while(n>0)
        bubble(a,n--);
}
int main(){
    int a[7]={7,2,1,3,6,5,4};
    int n=7;
    bubbleSort(a,n);
    for(int i=0;i<n;i++)
        printf("%d\t",a[i]);
}

选择排序

//选择
/*
选择排序就像是军训的时候按高矮个站队:
先在数组中挑出一个最高个和队伍最后面的同学换位置
然后排除最高个
再在剩余的同学里面挑最高个和倒数第二个交换 
然后再排除最高个和次高个
再在剩余的同学里面挑最高个和倒数第三个交换
。。。。。。 
*/ 
int selectPos(int a[],int n)
{
    int pos=0;
    int max=a[0];
    for(int i=0;i<n;i++)
    {
        if(max<a[i])
        {
            max=a[i];
            pos=i;
        }
    }
    return pos;
}
void selectionSort(int a[],int n)
{
    while(n>0)
    {
        int pos=selectPos(a,n);
        a[n-1]=a[pos]+a[n-1]-(a[pos]=a[n-1]);
        n--;
    }
}
int main(){
    int a[7]={7,2,1,3,6,5,4};
    int n=7;
    selectionSort(a,n);
    for(int i=0;i<n;i++)
        printf("%d\t",a[i]);
}

插入排序

//插入排序
/*
插入排序就像是你在斗地主:
当你抽到一张牌的时候,自然就需要往你现在的牌堆里面插入:方便你下一步打顺子
比如你抽到5的时候,自然就会往小于6的数字的位置放
这是一个总体的思想,现在开始拆分插入的过程:
首先明确:当数组中有1个数的时候是不需要排序的,所以for循环是从1开始的
(也就是对两个以上的数排序)
设当前接收到的数组的最后一个数字位key,拿数组中每一个数字和key作比较,当发现有小于
key的关键字时,就往数组里面插入 
*/ 
void insert(int a[],int n)
{
    int key=a[n];
    while(a[n-1]>key)
    {
        a[n]=a[n-1];
        n--;
        if(n==0)
            a[n]=key;
    }
    a[n]=key;
}
void insertSort(int a[],int n)
{
    for(int i=1;i<n;i++)//当数组中只有一个数时,默认有顺序的 
        insert(a,i);
}
int main(){
    int a[7]={7,2,1,3,6,5,4};
    int n=7;
    insertSort(a,n);
    for(int i=0;i<n;i++)
        printf("%d\t",a[i]);
}

相关推荐