各种排序算法汇总(交换排序:冒泡排序、快速排序)

以下是我对常见的几种排序算法的总结并给出的代码,基于C++语言实现,存储格式是顺序表。本人才疏学浅,如果有错漏还请各位指正。

一、存储格式:顺序表

int *data;			//存储数据(data[1...size]存储待排序序列,data[0]为临时单元)
int size;			//可存放容量


二、交换排序

1.冒泡排序:

(1)思路:它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端。

冒泡排序实例

另外附上一个很形象的冒泡排序以及快速排序算法flash演示http://www.tudou.com/v/htKY1-Rj9ZE

(2)空间复杂度:只需要一个记录的附加空间,即data[0](即O(1))

(3)时间复杂度:O(n^2)

(4)稳定性:稳定

(5)源代码:

//冒泡排序(从前往后冒泡)
void SeqList::bubbleSort()
{
	bool flag = false;						//设置交换标志(true表明有进行交换,false则没有交换)
	for (int i = 1; i <size; i++)				//共做size-1趟冒泡
	{
		for (int j = 1; j <= size - i; j++)
		{
			if (data[j]>data[j + 1])			//不符合顺序则交换
			{
				flag = true;					//有交换
				data[0] = data[j];
				data[j] = data[j + 1];
				data[j + 1] = data[0];
			}
		}
		if (!flag)
			break;							//无交换则结束冒泡排序
	}
}

(6)分析:思路简单,代码容易实现,但是效率低。是经典的排序算法,常用作编程新手入门学习。


2.快速排序:

(1)思路:任取待排序对象序列的某个对象(例如取第一个对象)作为基准按照该对象的排序码大小,将整个对象序列分为左右两个子序列:左侧子序列中的所有对象的排序码都小于等于基准对象的排序码,右侧子序列中的所有对象的排序码都大于等于基准对象的排序码;基准对象则排在这两个子序列的中间(这也是该对象最终安放位置);然后分别对这两个子序列(递归)重复施行上述方法直到所有对象排在相应位置上为止。


快速排序实例演示

(2)空间复杂度:在最坏的情况下,所占用的附加存储(栈)将达到O(n);

(3)时间复杂度:O(n*lnn)。

(4)稳定性:不稳定

(5)源代码:

//快速排序主过程
void SeqList::quickSort(int low, int high)
{
	int mid;
	if (low <= high)
	{
		mid = quickPass(low, high);
		quickSort(low, mid - 1);			//递归排序左半部分
		quickSort(mid + 1, high);			//递归排序右半部分
	}
}

//一趟快速排序
int SeqList::quickPass(int low,int high)
{
	data[0] = data[low];					//暂存
	while (low < high)
	{
		while ((low < high) && (data[high] >= data[0]))		//从后往前扫描
			--high;
		if (low < high)		//在被腾出来的单元(由low指向)填入data[high],并将low向右移动一个单元
			data[low++] = data[high];
		while ((low < high) && (data[low] <= data[0]))		//从前往后扫描
			++low;
		if (low < high)		//在被腾出来的单元(由high指向)填入data[low],并将high向左移动一个单元
			data[high--] = data[low];
	}
	data[low] = data[0];			//在正确的位置填入基准记录

	return low;
}

(6)分析:快速排序效率较高,且利用了分治法的思路,因此在面试、考研中常有涉及。就平均时间而言,快速排序是所有内排序方法中最好的一个(适用于n较大,当n很小时快速排序往往比其他简单排序方法还要慢)


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值