数据结构——排序(Part1:冒泡排序和选择排序)

(图源:大话数据结构)

好文分享:排序算法解析:https://blog.csdn.net/kexuanxiu1163/article/details/103051357 

目录

0准备工作

1冒泡排序(Bubble Sort)

1.1交换排序

1.2冒泡排序

1.3冒牌排序优化

2简单选择排序


0准备工作

保存排序内容的自定义结构体,其中顺序表的长度,不算哨兵(下标为零的部分)

#define MAX 10
typedef struct SqlistData
{
    int r[MAX+1];//把r[0]空出来当哨兵或者临时变量
    int length;//记录长度,因为0被空出来了,所以长度和下标此时统一了

}SqList;

交换接口

void swap(SqList * L,int i,int j)//交换
{
    int temp = L->r[i];
    L->r[i] = L->r[j];
    L->r[j] = temp;
}

打印接口

void print(SqList * L)
{
    qDebug()<<"开始打印";
    for(int i = 1;i<=L->length;++i)
    {
        qDebug()<<L->r[i];
    }
}

顺序表的储存结构如下:

                           

零位下标什么也不储存,所以无论是遍历还是排序,都是从下标1开始,顺序表长度为5,小标和顺序表中的元素序号完全一致。

1冒泡排序(Bubble Sort)

冒泡排序过程中,我们使用的顺序表是:{9,1,5,8,3,7,4,6,2}

    SqList Data = {{0,9,1,5,8,3,7,4,6,2},9};

1.1交换排序

                     

代码 排序外循环特点:n个数字比较n-1次,即可选择出最小

void BubbleSort_Part1(SqList * L)
{
    int i,j;
    for(i = 1;i<L->length;i++)//9个数循环8次
    {
        for(j = i+1;j<=L->length;++j)
        {
            if(L->r[i]>L->r[j])
            {
                swap(L,i,j);//交换
            }
        }
    }
}

 具体操作:

    print(&Data);
    BubbleSort_Part1(&Data);
    qDebug()<<"简单的交换排序后";
    print(&Data);

 

1.2冒泡排序

“按照一个顺序,相邻元素比较,根据顺序进行交换或者不交换” 

            

void BubbleSort_Part2(SqList * L)
{
    int i,j;
    for(i = 1;i<L->length;i++)//9个数循环8次
    {
        for(j = L->length;j>i;--j)
        {
            if(L->r[j-1]>L->r[j])
            {
                swap(L,j-1,j);//交换
            }
        }
    }
}

 具体操作:

    print(&Data);
    BubbleSort_Part2(&Data);
    qDebug()<<"简单的冒泡2排序后";
    print(&Data);

输出:

 

1.3冒牌排序优化

                       

void BubbleSort_Part3(SqList * L)
{
    int i,j;
    bool flag = true;
    for(i = 1;i<L->length&&flag == true;i++)//9个数循环8次
    {
        qDebug()<<i;
        flag = false;
        for(j = L->length;j>i;--j)
        {
            if(L->r[j-1]>L->r[j])
            {
                swap(L,j-1,j);//交换
                flag = true;//没有数据交换的时候,完成排序,直接跳出
            }
        }
    }
}

 具体操作:

    SqList Data2 = {{0,2,1,3,4,5,6,7,8,9},9};
    print(&Data2);
    qDebug()<<"循环次数";
    BubbleSort_Part3(&Data2);
    qDebug()<<"简单的冒泡优化排序后";
    print(&Data2);

 

                   

2简单选择排序

 “找到最小的并交换”

代码:排序外循环特点:n个数字比较n-1次,即可选择出最小 

void SelectSort(SqList * L)
{
    int i,j,min;
    for(i = 1;i<L->length;++i)
    {
        min = i;//假定初始就是最小
        for(j = i+1;j<=L->length;++j)
        {
            if(L->r[j]<L->r[min])
            {
                min = j;
            }
        }
        if(min!=i)//在外侧判断,不然在循环里面交换的次数太多了,选择出最小的,和该位置交换,然后如此往复
            swap(L,i,min);
    }
}

                                             

具体操作:

    print(&Data);
    SelectSort(&Data);
    qDebug()<<"简单的选择排序后";
    print(&Data);

 输出:

                             

                               

发布了85 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41605114/article/details/104820797