排序算法

        排序算法是很基础很成熟的算法,想要从网上搜出现成的代码,有很多。但是我觉得还是自己从理解原理,到编程应用整个过程都走一遍才能记住,看别人的,看一千遍都记不住的。排序算法有很多,先学习最基础的三种:插入排序、选择排序和冒泡排序。本文默认排序结果都是由小到大。

        插入算法其实和我们平时打扑克牌类似。核心思想是将未排序序列的元素按次序依次插入已排序序列。

       根据思想进行编程。默认第一个元素为已排序。因此对未排序元素的遍历也就是最外层循环i初始值需设置为1(数组下标从0开始到n-1),每次插入的元素为a[i]。将该元素插入到前面已排序元素,前面已排序元素是从0~i-1。内外层循环的序列已经确定,外层循环i是从1~n-1,内层循环是从i-1~0。然后就是插入过程,其实就是每次将待插入元素a[i]与已排序元素a[j]依次比较,当a[j]>a[i]时,要执行a[j+1]=a[j]操作,执行完以后j--,直到j<0或a[j]<=a[i],其实就是将满足a[j]>a[i]条件的已排序元素后移。这里有一点需要注意,在后移的时候a[j]会覆盖a[i]。因此需要设置临时变量保存a[i]的值。每次比较的时候,也是将temp与a[j]进行比较,否则会出错,当j<0,或者a[j]<=a[i]时,将j++,然后将temp的值赋给a[j]。当不满足a[j]>a[i]时,不用进行上述操作,因为本来就是由小到大的顺序。代码如下:

#include<iostream>
using namespace  std;
void charu(int a[],int n)
{
int j=0;
int temp=0;
    for (int i=1;i<n;i++)
    {
j=i-1;
temp=a[i];
if (a[j]>temp)
{
        while(j>=0&&temp<a[j])
{
a[j+1]=a[j];
j--;
}
      a[j+1]=temp;
}


    }
}
int main(void)
{
int  a[5]={12,34,1,2,5};
charu(a,5);
for(int i=0;i<5;i++)
{
cout<<a[i]<<endl;
}
return 0;
}

还有一个哨兵版本,哨兵有两个作用,一是进入查找循环之前,它保存了a[i]副本,使得不致于因记录后移而丢失的内容,它的主要作用是:在查找循环中“监视”下标j是否越界,一旦越界(即j=0),因为a[0]和自己比较,循环判断条件不成立使得查找循环结束,从而避免了在该循环内的每一次均瑶检测j是否越界(即省略了循环判定条件“j〉=1”)

void charu_shaobing(int a[],int n)
{
int j=0;
for (int i=2;i<=n;i++)
{
a[0]=a[i];
if (a[i]<a[i-1])
{
for (j=i-1;a[j]>a[0];j--)
                 a[j+1]=a[j];
a[j+1]=a[0];
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值