冒泡排序
(1)定义顺序表的存储结构;
(2)在顺序表上实现冒泡排序;
(3)将普通的冒泡排序进行多次改进以提高排序速度,并用大量数据测试其速度的提高。
1.普通版:
2.第一步优化:
若在一次排序中没有发生交换,说明此时已经全部有序无需再进行扫描
增加一个标记,记录是否进行过交换
3.第二步优化:
若上次排序位置为end,表示end-n的数已经有序,下次排序不需要再遍历
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
//定义顺序表的存储结构;
typedef struct {
int key;//关键字项
int otherinfo;//其他数据元素
}RedType;
typedef struct {
RedType r[105];//r[0]闲置或用作哨兵单元
int length;//顺序表表长
}SqList;//顺序表类型
void CreatSq(SqList &L) {
printf("请输入数据个数:");
scanf("%d", &L.length);
printf("请输入%d个数据元素:", L.length);
for (int i = 1; i <= L.length; i++)
scanf("%d", &L.r[i].key);
}
void Print(SqList L) {
printf("升序输出:");
for (int i = 1; i <= L.length; i++)
printf("%d ", L.r[i].key);
printf("\n\n");
}
//(2)在顺序表上实现冒泡排序;
void BubbleSort_A(SqList &L) {
CreatSq(L);
for (int i = 1; i<L.length; i++) {
for (int j = 2; j <= L.length; j++) {
if (L.r[j - 1].key>L.r[j].key) {
swap(L.r[j - 1].key, L.r[j].key);
}
}
}
Print(L);
}
//冒泡法第一步优化
//若在一次排序中没有发生交换,说明此时已经全部有序无需再进行扫描
//增加一个标记,记录是否进行过交换
void BubbleSort_B(SqList &L) {
CreatSq(L);
bool flag;//标记是否进行了排序
for (int i = 1; i<L.length; i++) {
flag = false;
for (int j = 2; j <= L.length; j++) {
if (L.r[j-1].key>L.r[j].key) {
swap(L.r[j-1].key, L.r[j].key);
flag = true;
}
}
if (!flag) break;//若没有排序,序列有序,退出
}
Print(L);
}
//若上次排序位置为end,表示end-n的数已经有序,下次排序不需要再遍历
void BubbleSort_C(SqList &L) {
CreatSq(L);
bool flag = true;
int end = L.length;
int k = end;
for (int i = 1; i<L.length; i++) {
flag = false;
for (int j = 2; j <= end; j++) {
if (L.r[j - 1].key>L.r[j].key) {
swap(L.r[j - 1].key, L.r[j].key);
flag = true;
k = j;
}
}
end = k;
if (!flag) break;
}
Print(L);
}
int main()
{
SqList L;
printf("1.普通冒泡排序\n");
BubbleSort_A(L);
printf("2.第一步优化后冒泡排序\n");
BubbleSort_B(L);
printf("3.第二步优化后冒泡排序\n");
BubbleSort_C(L);
system("pause");
return 0;
}