关于选择排序和插入排序

关于选择排序和插入排序:

在华清学习的第二天,学习了一位数组,主要学习为三种排序排序方式:冒泡排序、选择排序、插入排序


插入排序:

插入排序概念:
首先把数组第一个元素作为一个有序列,然后依次取后面数据进行比较插入,如果符合插入条件,插入位置后面的数组往后移动,把待插入数据插入相应符合的位置。
例如: nums[5]={2-5-1-3-4}(从大到小排序)
第一次:2-作为有序序列,将5与有序序列中元素进行比较,即5与2比较,因为2小于5,所以2数据往后移动一位nums[1]=2,5插入nums[0];得到结果:5-2的有序序列
第二次:1与有序序列{5-2}逐次比较,如果没有符合插入条件,则插入在有序数组末尾,即得到有序序列{5-2-1}
第三次:3与有序序列{5-2-1}逐次比较,根据比较得出3大于2,符合插入条件,序列{2,1}往后移位,3插入原先2的位置,即得到有序序列{5-3-2-1}

上面列子与代码无关!
代码请自行分析,多思考!

       int main()
{
        int nums[10]={12,11,4,7,2,8,9,1,3,2};//乱序数组
        int i,j,new;//new表示待插入数据
        for(i=1;i<10;i++)
        {   
                new=nums[i];//取待插入数据
                for(j=i-1;j>=0;j--)//进入有序序列逐次进行比较
                {   
                        if(nums[j]>new)//如果符合条件
                        {   
                                nums[j+1]=nums[j];//数组移动
                                nums[j]=new;//插入数据
                        }   
                }   
        }   
        for(i=0;i<10;i++)
        printf("%d-",nums[i]);
}


选择排序:

选择排序概念: 首先取第一个值为基准值,然后依次与后面元素比较,进行选择,如果符合选择条件,则记录数组内数据与下标,再往后面进行选择,最终选择最合适的数据;因为每次符合条件会记录数据与下标,最后选择出的数据与基准数据进行位置交换,依次循环最终得到有序序列。

例如:nums[5]={2,1,4,3,5}(从小到大排序)

第一次:选择nums[0],2为基准值,依次与后面数值进行选择比较,1小于2符合条件记录1的下标index=1,基准值变为1,继续选择比较,最后得到1位最终选择值,1与2交换位置,即得到{1,2,4,3,5}

第二次:选择nums[1]为基准值, 注意:经过上一次选择排序,nums[1]为2,依次比较后无符合条件,有序序列为{1,2,4,3,5}进行下一次循环

第三次:选择num[2]=4为基准值,往后进行选择比较,选择出数组3,下标3符合,进行交换位置,得到有序序列{1,2,3,4,5}

示例程序

int main()
{
        int nums[10]={2,4,6,8,0,1,3,5,7,9};
        int i,j,temp,index=0;//temp为基准值,index为基准值下标
        for(i=0;i<10;i++)
        {   
                temp=nums[i];//获取基准值
                index=i;//获取下标
                for(j=i+1;j<10;j++)//循环进行选择比较
                {
                        if(nums[j]<temp)//选择数据
                        {
                                temp=nums[j];
                                index=j;
                        }
                }
                //最终选择出的数据进行交换位置
                temp=nums[i];
                nums[i]=nums[index];
                nums[index]=temp;
        }
        for(i=0;i<10;i++)
        printf("%d->",nums[i]);
}

全为自己学习理解分享,如有错请多多指教,必会虚心接受!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值