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