我们在这里主要来讨论的是单个关键字的排序。
排序的稳定性:
假设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