用c++语言实现数据结构各种常见排序,有详细解释。

本文详细介绍了使用C++实现数据结构中七大排序算法的过程,包括冒泡排序、选择排序、插入排序、希尔排序、堆排序、归并排序和快速排序。文章不仅解释了每种排序算法的基本思想,还提供了相应的C++代码实现,帮助读者理解算法的内部工作机制。
摘要由CSDN通过智能技术生成

我们在这里主要来讨论的是单个关键字的排序。

排序的稳定性:

假设Ki=Kj,i不等于j,且在排序前的序列中Ki是领先与Kj的。如果排序后Ki仍是领先于Kj的,则称所用的排序方法是稳定的;反之是不稳定的。

内排序与外排序:

根据在排序过程中,待排序的记录是否全部被放置在内存中,排序分为内排序和外排序。

内排序是在整个排序过程中,待排序的所有纪录全部被放置内存中。外排序是由于需要排序的纪录太多,不能同时放置在内存中,整个排序过程需要在内外存之间多次交换数据进行。

1.时间性能

排序是处理数据中经常需要执行的一种操作,因此排序算法的时间开销是衡量其好坏的最重要标志。在内排序中,主要进行两项操作:比较和移动,比较指关键字之间的比较,移动至记录从一个位置移动到另一位置。总之,高效率的内排序算法应该是有尽可能少的关键字比较次数和尽可能少的移动次数。

2.辅助空间

评价待排序算法的另一个主要标准是执行算法需要的辅助存储空间。辅助存储空间时除了存放待排序记录所占用存储空间之外,执行算法所需要的其他存储空间。

这一章要学习七种排序的算法,按照算法的复杂度分为两大类,冒泡排序,选择排序,插入排序属于简单算法,而希尔排序,堆排序,归并排序,快速排序属于改进算法。

本文使用c语言实现相关功能。

在排序前先在结构体中定义线性表的顺序结构,方便实现排序。

typedef int ElemType;
#define MAXNUM 20

typedef struct 
{
	ElemType data[MAXNUM];
	int len;
}SqList;

还要定义一个交换函数和展示函数,需要时直接调用

void Swap(SqList* s1,int m,int n)
{
	ElemType t = s1->data[m];
	s1->data[m] = s1->data[n];
	s1->data[n] = t;
}

void Show(const SqList* s1,int begin=0)	
{
	for (int i = begin; i < s1->len + begin;++i)
	{
		printf("%d,",s1->data[i]);
	}
	puts("\b;");
}

一、冒泡排序

1,一种非标准的冒泡排序,n个待排序元素,需要进行n-1趟比较,每趟的比较次数一次从n-1次到1次。

定义两个变量i和j,一个为控制外层趟数循环,一个控制比较次数。i的初值为0,每次循环+1,到n-2结束。j从i+1开始,到n-1结束,每次循环+1。在内层循环中如果第j个小于第i个,则交换第i和第j个。这样就能保证每趟下来每趟的最小的处于每趟的第一个,这样就完成了非标准的冒泡排序(升序),实际可以将这种冒泡排序称为交换排序。c语言实现的代码如下:

void BuddleSort1(SqList* s1)	//非标准的冒泡排序(并非通过比较相邻记录)交换排序而已
{
	for (int i = 0; i < s1->len - 1; i++)
	{
		for (int j = i + 1; j < s1->len; j++)
		{
			if (s1->data[j] < s1->data[i])
			{
				Swap(s1, i, j);
			}
		}
	}
}

下面介绍标准的冒泡排序,与上面交换排序类似,趟数相同,j从下标为0开始,直到n-1-i,每趟下来jj+1。每趟中两两相邻的比较若下标为j的大于下标为j+1的则交换。即当前元素大于下一个元素交换&#x

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值