排序-冒泡排序

交换排序:如果发生逆序则交换,直到所有记录都排好序为止。

最简单的交换排序就是人们所熟知的冒泡排序了。这也是我最早接触的排序算法了。

冒泡排序的思想:每一趟排序时,从首记录开始相邻两树进行比较,逆序则交换,每趟排序都会使当前最大的数沉到末尾。小数逐步上升,至多n-1趟排序完成,若中间某趟无交换则排序完成。

输入:顺序表的长度,顺序表中各个元素。

输出:排好序的顺序表中各个元素。

运行结果:

辅助宏:

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
#define NULL 0
typedef char *InfoType;
typedef int KeyType; //设关键字为整型

顺序表的存储结构定义:

typedef struct
{
   KeyType key; //关键字
   InfoType otherinfo;//其他数据项
}RedType;
//顺序表的存储结构定义
typedef struct
{
   RedType *r; //r[0]一般做哨兵
   int length; //顺序表的长度
}SqList;

算法实现:

void BubbleSort(SqList &L)
{
    /*冒泡排序
    每一趟排序时,从首记录开始相邻两数进行比较,逆序则
    交换,每趟排序都会使当前最大的数沉到末尾,小数逐步
    上升,至多n-1趟排序完成,若中间某趟无交换则排序完成*/
    int i,j,isOrder; //isOrder判断是否已经排好序
    RedType t;
    for(i=1;i<=L.length-1;i++)
    {
        isOrder=TRUE;
        for(j=1;j<=L.length-i;j++)
	    if(L.r[j].key>L.r[j+1].key)
            {
	        isOrder=FALSE;  //有交换说明没有排好序
		RedCopy(t,L.r[j]);
                RedCopy(L.r[j],L.r[j+1]);
		RedCopy(L.r[j+1],t);
	    }
     if(isOrder)   //如果排好序之间返回
         return;
   }
}

复制元素r2到r1

void RedCopy(RedType &r1,RedType r2)
{
    //复制元素r2到r1
    r1.key=r2.key;
    r1.otherinfo=r2.otherinfo;
}

算法分析:

最好情况下,只需一趟排序,比较次数为n-1,不移动。

最坏情况下n-1趟排序,第i趟比较n-i次,移动3(n-i)次。

计算得总的比较次数 n*(n-1)/2 移动次数 3n*(n-1)/2

时间复杂度O(n^2)

空间复杂度O(1)

是一种稳定的排序算法。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值