R6-3 基于顺序表的冒泡排序(重者沉)【有题解视频,可本地编译器调试】

本题要求实现基于顺序表的“重者沉”的冒泡排序算法,就是第一趟排序把最大值排到表尾,第二趟排序把次大值排到表尾倒数第二位,以此类推。最后要求打印出每一趟的排序结果。

个人:

void BubbleSort(SqList *L)
{
    int i, j, n, flag;
    
    n = L->length; // 获取顺序表的长度
    for (j = 1; j <= n - 1; j++) // 外层循环控制趟数,总共进行 n-1 趟
    {
        flag = 1; // 设置标志位,如果一趟排序没有发生交换(出去后还等于1),则说明已经有序,可以提前结束排序
        for (i = 0; i <= n - j - 1; i++) // 内层循环进行相邻元素的比较与交换共 n-j 次
        {
            if (L->list[i] > L->list[i + 1]) // 如果前面的元素大于后面的元素,则交换它们的位置
            {
                swap(L,i,i+1);
                flag = 0; // 标志位置零,表示本趟排序发生了交换
            }
        }
        if (flag == 1) // 如果本趟排序没有发生交换,说明已经有序,提前结束排序
        {
            break;
        }
        TraverList(*L); // 打印当前趟的排序结果
    }
}

顺序表的结构体定义如下

 
typedef int DataType;                                
#define LISTSIZE 100                                
typedef struct
{
    DataType list[LISTSIZE];
    int length;
}SqList;

函数接口定义:

 
void BubbleSort(SqList *L);

L 是用户传入的参数,代表待排序的顺序表,也是排序后返回的顺序表。要求打印出每一趟的排序结果。

裁判测试程序样例:

 
#include <stdio.h>
typedef int DataType;                                // 定义具体数据类型

#define LISTSIZE 100                                // LISTSIZE 表示顺序表可能的最大数据元素数目

/****** 顺序表存储结构 ******/
typedef struct
{
    DataType list[LISTSIZE];
    int length;
}SqList;


/****** 初始化顺序表 ******/
int InitList(SqList *L)                // L为指向顺序表的指针
{
    L->length = 0;            
    return 1;
}

/****** 求顺序表表长 ******/
int ListLenth(SqList L)                // L为顺序表
{
    return L.length;        
}

/****** 判断顺序表是否为空 ******/
int ListEmpty(SqList L)                // L为顺序表
{
    if (L.length <= 0)        
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

/****** 向顺序表插入元素 ******/
int ListInsert(SqList *L, int pos, DataType item)
{                                    // L为指向顺序表的指针,pos为插入位置,item为待插入的数据元素
    int i;

    if (L -> length >= LISTSIZE)    // 判断顺序表是否已满
    {                                
        printf("顺序表已满,无法插入\n");
        return 0;
    }

    if (pos <= 0 || pos > L -> length + 1)
    {                                // 检查元素插入位置是否在顺序表里
        printf("插入位置不合法\n");
        return 0;
    }

    for (i = L -> length - 1; i >= pos - 1; i--)
    {                                // 移动数据元素
        L -> list[i + 1] = L -> list[i];
    }

    L -> list[pos - 1] = item;        // 插入元素
    L -> length++;                    // 表长加一

    return 1;
}


/****** 遍历顺序表 ******/
int TraverList(SqList L)            // L为顺序表
{                        
    int i;
    for(i = 0; i < L.length; i++)
    {
        printf("%d ", L.list[i]);
    }
    printf("\n");
    return 1;
}

void swap(SqList *L, int i, int j)
{
    DataType temp = L->list[i];
    L->list[i] = L->list[j];
    L->list[j] = temp;
}
void BubbleSort(SqList *L);
int main()
{
    SqList L;
    DataType x;
    char ch;
    int pos = 1;
    InitList(&L);
    do
    {  
        scanf("%d",&x);  // 某些编译器要求此处改为scanf_s
        ListInsert( &L , pos++ , x );        
    }while ((ch=getchar())!='\n');
    BubbleSort(&L);
    printf("The sorted List is\n");
    TraverList(L);
    return 0;
}
/* 请在这里填写答案 */

输入样例:

23 45 12 20 31

输出样例:

23 12 20 31 45 
12 20 23 31 45 
The sorted List is
12 20 23 31 45 
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
描述 本题要求实现基于顺序表的“重者”的冒泡排序算法,就是第一趟排序把最大值排到表尾,第二趟排序把次大值排到表尾倒数第二位,以此类推。最后要求打印出每一趟的排序结果。 顺序表的结构体定义如下: ``` typedef struct LNode *PtrToLNode; struct LNode { ElementType Data[MAXSIZE]; int Last; }; typedef PtrToLNode List; ``` 其中 `ElementType` 为顺序表中存储的元素类型,`MAXSIZE` 为顺序表的最大长度,`Last` 为顺序表中最后一个元素的下标。 函数接口定义: ```c void PrintList( List L ); // 输出整个表 void Bubble_Sort( List L ); // 冒泡排序 ``` 输入样例: 无输入。 输出样例: 无输出。 输入样例2: 无输入。 输出样例2: 假设顺序表中初始元素为 9 8 7 6 5 4 3 2 1 ,则每一趟排序的结果依次输出如下: ``` 9 8 7 6 5 4 3 2 1 8 7 6 5 4 3 2 1 9 7 6 5 4 3 2 1 8 9 6 5 4 3 2 1 7 8 9 5 4 3 2 1 6 7 8 9 4 3 2 1 5 6 7 8 9 3 2 1 4 5 6 7 8 9 2 1 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 ``` 函数实现: ```c++ void PrintList( List L ) { int i; for ( i = 0; i < L->Last; i++ ) printf( "%d ", L->Data[i] ); printf( "%d\n", L->Data[L->Last] ); } void Bubble_Sort( List L ) { int i, j, tmp; for ( i = L->Last; i >= 1; i-- ) { // i 表示尚未排好序的最后一个位置 for ( j = 0; j < i; j++ ) { // 内层循环遍历 i 之前的元素 if ( L->Data[j] > L->Data[j+1] ) { // 如果相邻元素逆序,则交换 tmp = L->Data[j]; L->Data[j] = L->Data[j+1]; L->Data[j+1] = tmp; } } PrintList( L ); // 每一趟排序结束后输出结果 } } ``` 时间复杂度 冒泡排序的最好时间复杂度为 $O(n)$(即顺序表已经有序的情况),最坏时间复杂度为 $O(n^2)$(即顺序表逆序的情况),平均时间复杂度为 $O(n^2)$。 空间复杂度 冒泡排序的空间复杂度为 $O(1)$,因为只需要常数级别的辅助空间来进行交换操作。 完整代码

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值