冒泡排序、快速排序

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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
冒泡排序快速排序都是常见的排序算法,它们各自有不同的优缺点。 冒泡排序的基本思想是通过相邻元素的比较和交换来将较大的元素逐渐“冒泡”到数组的末尾。具体步骤如下: 1. 从数组的第一个元素开始,依次比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置。 2. 继续比较下一对相邻元素,重复上述操作,直到最后一对元素。 3. 重复以上步骤,每次比较的元素个数减少一,直到所有元素都排好序。 冒泡排序的优点是实现简单,代码易于理解和实现。然而,冒泡排序的缺点是效率较低,特别是在处理大规模数据时,时间复杂度为O(n^2),性能较差。 快速排序是一种分治法的排序算法,它通过选择一个基准元素将数组分成两个子数组,然后递归地对子数组进行排序。具体步骤如下: 1. 选择一个基准元素(通常选择第一个或最后一个元素)。 2. 将数组分成两个子数组,小于基准元素的放在左边,大于基准元素的放在右边。 3. 递归地对左右子数组进行快速排序。 4. 合并左右子数组和基准元素。 快速排序的优点是在平均情况下具有较高的效率,时间复杂度为O(nlogn)。它也是一种原地排序算法,不需要额外的空间。然而,快速排序的缺点是在最坏情况下(如已经有序的数组),时间复杂度可能达到O(n^2),性能下降。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值