冒泡、插入、选择

一、冒泡排序

思路:
    1.首先有两层循环,外层循环是用来进行遍历的
    2.内层循环从0开始遍历len-i-1次,-i是为防止与已经排好的元素进行比较,从而导致出错,-1是为了防止溢出
    3.使用if进行判断,始终保持从小到大,若相邻两元素不满足此条件,两两进行交换
 

/*
*函数的参数:int arr[]传入所需要排序的数组, int len 传入数组的长度
*函数的用法:通过两层循环,并两两进行比较,将最大值存储到后方
*函数的结果:得到从小到大已经排序好的数组
*注意事项:1.在传数组时,不能以值形式传参,否则arr输出不改变
*         2.不能再fun函数内进行len的计算,算出的是数组首元素地址的长度
*         3.里层循环条件结束必须len-i-1,i是为了防止和上次循环的最大值比较,1是因为比较时是j和j+1,避免j+1超过数组下标
*/

void fun(int arr[],int len){
    for(int i=0;i<len-1;i++){          //第一层循环进行遍历
        for(int j=0;j<len-i-1;j++){    //第二层循环进行比较,将最大值往后面放,结束条件为len-i-1为了避免和后面已经存储好的最大值冲突,导致出错
            if(arr[j]>arr[j+1]){       //通过比较将最大数存储到后面
                int tmp=arr[j];        //两两比较,进行交换
                arr[j]=arr[j+1];
                arr[j+1]=tmp;
            }
        }
    }
}
int main(){
    int arr[]={12,23,1,24,45,56,89,78,54,13};
    int len=sizeof(arr)/sizeof(arr[0]);    //计算数组长度
    fun(arr,len);
    for(int i=0;i<len;i++){        //for循环遍历,输出
        printf("%d ",arr[i]);
    }
}

二、选择排序

思路:

    1.首先有两层循环,外层循环是用来进行遍历的
    2.内层循环从i开始遍历到len,从i开始是因为通过每次比较将最小的值放入i,避免与上一次的冲突,我们从i开始
    3.使用if进行判断,始终保持从小到大,若相邻两元素不满足此条件,使arr[i]与arr[j]进行交换

/*
*函数的参数:int arr[]传入所需要排序的数组, int len 传入数组的长度
*函数的用法:通过两层循环,并进行比较,保证较小数在前,若不满足进行交换
*函数的结果:得到从小到大已经排序好的数组
*注意事项:1.在传数组时,不能以值形式传参,否则arr输出不改变
*         2.不能再fun函数内进行len的计算,算出的是数组首元素地址的长度
*         3.里层循环必须从i开始,避免与已经排好的数组进行冲突
*/



void fun(int arr[],int len)
{
    for(int i=0;i<len;i++)        //遍历len次
    {
        for(int j=i;j<len;j++)    //从i遍历到len避免与已经排好的发生冲突
        {
            if(arr[j]<arr[i])    //始终保持i小,若不满足进行交换
            {
                int tmp=arr[j];
                arr[j]=arr[i];
                arr[i]=tmp;
            }
        }
    }
}
int main(){
    int arr[]={12,23,1,24,45,56,89,78,54,13};
    int len=sizeof(arr)/sizeof(arr[0]);    //计算数组长度
    fun(arr,len);
    for(int i=0;i<len;i++){        //for循环遍历,输出
        printf("%d ",arr[i]);
    }
}

三、插入排序

思路:

    1.首先有两层循环,外层循环是用来进行遍历的
    2.内层循环从i-1开始,结束条件使>=0,因为数组下标到0故等于0,从i-1开始是我们认为i的左边元素是有序数组,我们将arr[i]与有序数组的元素进行比较(在内层循环开始前,将arr[i]存储起来,防止因为覆盖改变元素导致出错)
    3.使用if进行判断,将arr[i]与有序数组元素比较,若有序数组元素大于arr[i],我们进行覆盖,直到找到小于arr[i]的元素,结束跳出循环,跳出循环后进行插入,将arr[j+1]等于arr[i]的值

/*
*函数的参数:int arr[]传入所需要排序的数组, int len 传入数组的长度
*函数的用法:通过两层循环,并进行比较,通过比较,排列有序数组,不满足进行覆盖
*函数的结果:得到从小到大已经排序好的数组
*注意事项:1.在传数组时,不能以值形式传参,否则arr输出不改变
*         2.不能再fun函数内进行len的计算,算出的是数组首元素地址的长度
*         3.外层循环从1开始,使左边为有序数组,里层循环必须从i-1开始,结束>=0将tmp与有序数组比较进行排序,之后进行插入
*/
void fun(int arr[],int len)
{
    int j;
    for(int i=1;i<len;i++)    //将第一个元素作为有序数组,估下标从1开始,进行比较
    {
        int tmp=arr[i];        //避免因为覆盖导致arr[i]改变,从而使后面插入出错
        for(j=i-1;j>=0;j--)    //与左边有序数组循环
        {
            if(arr[j]>tmp)    //与左边有序数组进行比较
            {
                arr[j+1]=arr[j];    //不满足进行覆盖
            }
            else
            break;            //满足条件退出循环
        }
        arr[j+1]=tmp;        //进行插入操作
    }
}
int main(){
    int arr[]={12,23,1,24,45,56,89,78,54,13};
    int len=sizeof(arr)/sizeof(arr[0]);    //计算数组长度
    fun(arr,len);
    for(int i=0;i<len;i++){        //for循环遍历,输出
        printf("%d ",arr[i]);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值