几种简单的排序

//冒泡排序

for (i=0;i<len-1;i++) //排序的趟数
   { 
        for (j=0;j<len-1-i;j++) //len-1-i每次排序后,右边都固定了当前最值 
        {
                if (arr[j]>=arr[j+1]) 
                {
                        temp=arr[j];
                        arr[j]=arr[j+1];
                        arr[j+1]=temp;
                }
        }
   }

思想:以升序为例,通过每两个相邻的元素比较大小,数值大的换到右边的方式,将数组中最大的值移至数组最右边,然后将其固定,再从第一个元素开始寻找第二大的值,同样进行移动,以此类推。每次排序都将剩余的元素中的最大值冒泡。

//双向冒泡排序

     int start=0,tail=len-1;
     while (start<=tail) //如果还有元素没确定其位置
     {
             for (i=start;i<tail;i++)
             {
                     if (arr[i]>arr[i+1])
                     {
                             temp=arr[i];
                             arr[i]=arr[i+1];
                             arr[i+1]=temp;
                     }
             }
             tail--;  //向右冒泡一次
             for  (i=tail;i>start;i--)
             {
                     if (arr[i]<=arr[i-1])
                     {
                             temp=arr[i];
                             arr[i]=arr[i-1];
                             arr[i-1]=temp;
                     }
             }
             start++; //向左冒泡一次
     }

思想:原理同冒泡排序一样,但是双向进行的,即最大值向右冒泡,最小值向左冒泡,两边同时进行,算法复杂度也为(n^2),但优于单向冒泡。

//直接插入排序

for (i=1;i<len;i++)  //第一个元素是子集合
     {
             temp=arr[i]; //存储即将插入的元素
             j=i-1; //  j为该元素前一个元素(前面为已排序的元素)则的下标
            while (j>=0&&temp<arr[j]) //如果比前一个元素小
             {
                     arr[j+1]=arr[j];//右移
                     j--; //继续与左边元素比较
             }
             arr[j+1]=temp; //直到找到合适的位置
     }

思路:顺序地将数值插入已排序好的子集里,子集元素初始为1,后渐渐插入元素,将元素放到合适位置,子集仍然保持升序,直到子集和数组元素个数相同时结束排序。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值