1、冒泡排序是一种交换排序,基本思想是两两比较相邻的关键字,如果反序就交换,直到没有反序为止。
(1)最简单的冒泡排序,严格意义来说并不算冒泡排序,因为它不满足两两比较相邻元素,只是最简单的交换排序而已, 效率非常低。
(2)正宗的冒泡排序,当i = 1时,j从表尾开始反向循环到头,逐个比较,将较小值交换到前面,直到找到最小值放到第一个位置。
(3)优化后的冒泡排序,加入一个flag判断,能够避免在元素有序的情况下再进行无谓的判断,增加排序的效率。
冒泡排序的时间复杂度为
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define MAXSIZE 10
typedef struct
{
int data[MAXSIZE];
int length;
}SqList;//表
void Insert(SqList *L)
{
L->length = MAXSIZE;
printf("请输入%d个数字:",L->length);
for (int i = 0; i < L->length; i++)
{
scanf_s("%d",&L->data[i]);
}
}
void Out(SqList *L)
{
int i;
for (i = 0; i < MAXSIZE; i++)
{
printf("%d ", L->data[i]);
}
printf("\n");
}
void GuluGulu1(SqList &L)
{
Insert(&L);
printf("表中的元素:");
Out(&L);
int i, j;
for (i = 0; i < L.length; i++)
{
for (j = i+1; j < L.length ; j++)
{
if (L.data[i] > L.data[j])
swap(L.data[i],L.data[j]);
}
}
printf("冒泡排序1后的结果:");
Out(&L);
}
void Gulugulu2(SqList &L)
{
Insert(&L);
printf("表中的元素:");
Out(&L);
int i, j;
for (i = 0;i < L.length; i++)
{
for (j = L.length - 1; j >= i; j--)
{
if (L.data[j] < L.data[j - 1])
swap(L.data[j], L.data[j - 1]);
}
}
printf("冒泡排序2后的结果:");
Out(&L);
}
void GuluGulu3(SqList &L)
{
Insert(&L);
printf("表中的元素:");
Out(&L);
int i, j;
int flag = 1;
for (i = 0; i < L.length && flag == 1; i++)
{
flag = 0;//将flag置为0
for (j = L.length - 1; j >= i ; j--)
{
if (L.data[j] < L.data[j - 1])
swap(L.data[j], L.data[j - 1]);
flag = 1;//发生数据交换就把flag置1
}
}
printf("冒泡排序3后的结果:");
Out(&L);
}
int main()
{
SqList L;
GuluGulu1(L);
Gulugulu2(L);
GuluGulu3(L);
}