1.冒泡排序
冒泡排序也称简单交换排序。它的基本操作很简单。首先将第一个记录与第二个纪录相比较,如果为逆序,则交换两者,然后比较第二个和第三个记录,以此类推,直到第n-1个关键字和第n个关键字相比较为止,这为一趟冒泡,其结果是最大的记录被安排到了最后一个位置。然后进行第二趟冒泡,对前n-1个记录进行同样操作,直到完成n-1趟冒泡为止。
冒泡排序算法:
//冒泡排序
#define MAXSIZE 256
typedef int KeyType;
typedef struct {
KeyType r[MAXSIZE + 1]; //0号单元闲置
int length; //顺序表长度
}SqList; //用于排序的顺序表类型
void BubbleSort(SqList& L) {
KeyType temp;
for (int i = 1; i < L.length; i++) {
for (int j = 1; j <= L.length; j++) {
if (L.r[j] > L.r[j + 1]) {
temp = L.r[j];
L.r[j] = L.r[j + 1];
L.r[j + 1] = temp;
}
}
}
}
2.快速排序
快速排序算法是对冒泡排序算法的一种改进,属于交换排序。
假设有一个由n个记录组成的待排序的序列。首先选取一个记录为枢轴(一般选第一个),按下述原则重新排列其余记录:将所有比它小的记录都移到它的位置之前,将所有比它大的记录都移到它的位置之后。此时该枢轴就位于排序后本该属于它的位置。然后将枢轴的位置i作为分界线,将序列分为两个子序列。这个过程称为一趟快速排序。接下来对所分割的子序列递归的进行快速排序, 直到子序列的长度为1为止。
快速排序的算法思想:
- (1)一趟快速排序的实现过程:设两个指针low和high,它们的初值分别为子序列的起点和终点。设枢轴记录为第一个记录,并存储在临时变量中,对应的关键字称为pivotkey。首先从high所指位置起向前搜索,找到第一个关键字小于pivotkey的记录,将其送到low的位置。然后从low位置向后搜索,找到第一个大于pivotkey的记录,将其送到high的位置。重复上述两步直到low=high为止,将枢轴记录存入low位置。
- (2)对枢轴记录的前后两个序列进行快速排序,直到子序列只有一个记录为止。
快速排序算法:
#define MAXSIZE 256
typedef int KeyType;
typedef struct {
KeyType r[MAXSIZE + 1]; //0号单元闲置
int length; //顺序表长度
}SqList; //用于排序的顺序表类型
int Partition(SqList& L, int low, int high) { //一趟快速排序算法
//一趟快速排序:使枢轴记录到位,此时在他之前(后)的记录均不大(小)于它
KeyType temp = L.r[low]; //用子表的第一个记录作为枢轴,并存储在临时变量中
while (low < high) {
//用表的两端交替向中间扫描
while (low < high && L.r[high] > temp)
high--;
L.r[low] = L.r[high];
while (low < high && L.r[low] < temp)
low++;
L.r[high] = L.r[low];
}
L.r[low] = temp;
return low;
}
//low和high区间的快速排序算法
int pivotloc;
void QSort(SqList& L, int low, int high) {
//在对记录序列进行一趟快速排序后,分别对两个子序列进行递归,完成快速排序
if (low < high) {
pivotloc = Partition(L, low, high); //一趟快速排序
QSort(L, low, pivotloc - 1); //对前部子序列进行递归快速排序
QSort(L, pivotloc + 1, high); //对后部子序列进行递归快速排序
}
}
//快速排序算法
void QuickSort(SqList& L) {
QSort(L, 1, L.length);
}