冒泡排序是一种最简单的排序方法,通过比较相邻的元素,若发生倒序,则交换,使最大值“沉”到最后。其空间复杂度为O(1),时间复杂度为O(n2)。冒泡排序是一种稳定的排序,可可用于顺序或者链式存储结构,平均时间性能比直接插入差。当初始记录无序且n较大时,不宜采用此方法。
首先是预定义和类型定义:
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct{
ElemType *data;
int length;
}SqList;
顺序表创建:
Status EnSqList(SqList *L, ElemType e, int n)
{
L->data[n] = e;
L->length++;
return OK;
}
冒泡排序算法:
void BubbleSort(SqList *L)
{
int j, temp, flag = 1;
while (flag == 1 && (L->length - 1) > 0)
{
flag = 0;
for (j = 0; j < (L->length - 1); j++)
{
if (L->data[j]>L->data[j + 1])
{
flag = 1;
temp = L->data[j];
L->data[j] = L->data[j + 1];
L->data[j + 1] = temp;
}
}
}
}
初始化flag为1表示数组无序,当数组无序并且数组长度大于1的时候,执行循环:
先领flag=0,假设数组有序,然后j从0开始判断j号元素是否比j+1号元素大,若大,则交换位置,最终使其“沉”到最后一位,并让flag为1表示数组仍然无序。
重复执行以上操作。
加入main():
int main(void)
{
SqList L;
ElemType e;
int i, n;
L.length = 0;
printf("输入元素个数:");
scanf("%d", &n);
L.data = (int *)malloc(sizeof(int)*n);
srand((int)time(0));
for (i = 0; i < n; i++)
{
e = rand();
EnSqList(&L, e, L.length);
}
printf("原数组:");
for (i = 0; i < L.length; i++)
printf("%d ", L.data[i]);
printf("\n");
BubbleSort(&L);
printf("排序后:");
for (i = 0; i < L.length; i++)
printf("%d ", L.data[i]);
printf("\n");
return 0;
}