顺序表上实现冒泡排序及其优化

冒泡排序

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;
}


  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值