交换排序

交换排序

所谓交换,就是根据序列中关键字的比较结果来交换这两个记录在序列中的位置。交换排序的算法很多,在这里只介绍冒泡排序和快速排序。

一、冒泡排序

冒泡排序算法的基本思想是:设待排序表长为n,从后往前(也可从前往后)两两比较相邻两个元素的值,若为逆序(默认从小到大排列,逆序则为A[i-1]>A[i]),则交换两个元素在序列中的位置。直达序列比较完,则完成一次冒泡。每次冒泡结束后,序列中的最小值就交换到了序列中的第一个位置。下次冒泡时候,序列中的第一个元素不参与冒泡,即待排序列的长度减一。如此最多n-1次冒泡就将所有元素都排好。

c++测试代码如下

#include<iostream>
using namespace std;
void BubbleSort(int A[], int n) {
	bool flag;
	int i;
	int j;
	for (i = 0;i < n - 1;i++) {
		flag = false;
		for (j = n - 1;j > i;j--) {
			if (A[j - 1] > A[j]) {
				swap(A[j - 1], A[j]);
				flag = true;
			}
		}
		if (flag = false)
			return;
	}
}
void main() {
	int A[10] = { 23,43,45,57,86,34,94,90,24,64 };
	int n = 10;
	BubbleSort(A, 10);
	for (int i = 0;i < 10;i++)
		cout << A[i] << "  ";
	while (1);
}

输出结果如下


算法分析

空间复杂度:仅使用了常数个辅助单元,空间复杂度为O(1)。

时间复杂度:最好情况下,原始序列为有序时,仅需比较n-1次即可,则时间复杂度为O(n);最坏情况下,即原始序列为逆序时候,需要比较(n-1)n/2次,且每次比较都需要移动元素3次来交换元素位置(swap()函数中),即3(n-1)n/2次移动,则时间复杂度为O(n2);平均时间复杂度也为O(n2)。

稳定性:由于冒泡排序先比较后移动,则易知其为稳定的排序方法。

二、快速排序

快速排序的基本思想是基于分治法的 , 在待排序表L[1......n]中,取一个元素pivot作为基准,通过一趟排序把带排序表分为两个独立部分,其中L[1.......k-1]中的元素都小于pivot,L[k+1.......n]中的元素都大于pivot,并且让pivot置于最终位置L[k]中。这就完成了一趟快速排序,然后分别对两个子表递归的调用上述过程,直至每部分内只剩一个元素或者空为止。即完成快速排序。

快速排序分为两个部分,一部分是对划分算法, 另一部分是递归调用。划分算法并不唯一,并且决定着快速排序算法性能的好坏,在这里假设每次总是以当前表的第一个 元素作为枢轴值pivot进行划分。

c++测试代码如下:

#include<iostream>
using namespace std;
int Partition(int A[], int low, int high) {
	int pivot = A[low];    //当前表中的第一个元素作为枢轴值
	while (low < high) {       //跳出循环条件
		while ((low < high)&&(A[high] >=pivot)) --high;
		A[low] = A[high];	//比枢值小的移到左边
		while ((low < high)&&(A[low] <= pivot))  ++low;
		A[high] = A[low];   //比枢值大的移到右边
	}
	A[low] = pivot;
	return low;
}
void QuickSort(int A[], int low, int high) {
	if(low < high) {
		int pivotpos = Partition(A, low, high);
		QuickSort(A, low, pivotpos - 1);
		QuickSort(A, pivotpos + 1, high);
	}
}
void main() {
	int A[10] = { 52,49,80,36,14,75,58,97,23,61 };
	QuickSort(A, 0, 9);
	for (int i = 0;i <= 9;i++)
		cout << A[i]<< "  ";
	while (1);
}

结果输出如下:



算法分析:

空间复杂度:由于快速排序是递归的,需要借助一个递归工作栈,其容量应该与递归调用的最大深度一致。最好情况下深度为log2(n)+1,空间复杂度为O(log2(n+1));最坏情况下需要n-1次递归调用,空间复杂度为O(n);平均情况下为空间复杂度为O(log2(n))。

时间复杂度:快速排序的运行时间与划分是否对称有关,即与划分算法有关。最坏情况下(初试序列为基本有序或基本逆序时候),每一次划分都是0和n-1个元素,则时间复杂度为O(n2);最好情况下(每次轴枢值都能将当前序列中分),则时间复杂度为O(log2(n));平均情况下,快速排序的运行时间和最佳情况下很接近。快速排序是所有内部排序算法中平均性能最优的排序算法。

稳定性:快速排序是一个不稳定的排序算法。例如若右端区间有两个相同元素,且均小于轴枢值,在交换到左边区间后,其相对位置会发生变化。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值