十大基础应用算法及C++实现(一)----快速排序算法

算法是程序的灵魂,无论学习什么语言,做什么工程项目,都要考虑算法的效率实现,本系列主要列举最基础的十大应用算法以及个人的C++代码实现,程序全部调试并运行测试通过。有什么问题希望大神指出,本人不吝赐教。

算法一:快速排序算法

快速排序算法是由东尼·霍尔提出的一种快速排序算法。它的基本算法思想是在数组序列中找一个基准值,以这个基准值为基础将数列分成大于或者小于这个基准值的两个子序列,再递归地对每个子序列作以上操作。

先来一个简单实现:

#include "stdafx.h"
#include <iostream>
#define SIZE 10

int main()
{

	using namespace std;
	int* all = new int[SIZE];
	cout << "请输入"<< SIZE << "个用于排序的整数";
	for (int i = 0; i < SIZE; i++)
	{
		cout << "\n";
		cin >> all[i];
	}

	compare(all, 0, SIZE-1);//比较排序函数,传入数组,数组头和尾index
	cout << "排序后输出:";
	for (int i = 0; i < SIZE; i++)
		cout << all[i]<<"\t";

    return 0;
}

void compare(int* all,int pos1,int pos2)
{
	int size = pos2 - pos1 + 1;
	int standard = all[pos1];
	int size1 = 0;
	int size2 = 0;
	int* half1 = new int[size - 1];//存放子序列
	int* half2 = new int[size - 1];
	for (int index = 1; index < size; index++)
	{
		if (all[pos1 + index] <= standard)
		{
			half1[size1] = all[pos1 + index];
			size1++;
		}
		else
		{
			half2[size2] = all[pos1 + index];
			size2++;
		}
	}
	if (size1 > 0)
	{
		for (int i = 0; i < size1; i++)
			all[pos1 + i] = half1[i];
		all[pos1 + size1] = standard;
		compare(all, pos1, pos1 + size1 - 1);//对子序列递归调用
	}
	if (size2 > 0)
	{
		for (int j = 0; j < size2; j++)
			all[pos2 - j] = half2[j];
		compare(all, pos2 - size2 + 1, pos2);//对子序列递归调用
	}
	delete [] half1;//注意释放内存,防止泄露
	delete [] half2;


}

执行结果:



为了进一步验证算法效率,我们采用随机生成的数组,并与冒泡排序算法作比较,并计算所用时间。

代码如下,

#include "stdafx.h"
#include <stdlib.h>
#include "ConsoleApplication1.h"
#include <iostream>
#include <time.h>
#define SIZE 100000

int main()
{

	using namespace std;
	double        dStartTime1;                //快速排序算法起始时间
	double        dEndTime1;     
	double		  usetime1;
	double        dStartTime2;                //冒泡算法起始时间
	double        dEndTime2;    
	double		  usetime2;

	int* all = new int[SIZE];
	int* all1 = new int[SIZE];//随机数组的两个排序副本
	int* all2 = new int[SIZE];
	
	srand((unsigned)time(NULL)); //用时间做种,每次产生随机数不一样

	for (int i = 0; i < SIZE; i++)
	{
		all[i] = rand() % SIZE + 1;  //产生随机数组
		all1[i] = all[i];
		all2[i] = all[i];
	}
	//cout << "随机生成的数组为:"<<"\n";
	//for (int i = 0; i < SIZE; i++)
	//{
	//	cout << "\t"<< all[i];
	//	if ( (i+1) % 10 == 0)
	//		cout << "\n";
	//}

	dStartTime1 = clock(); //Get The Start Time
	compare1(all1, 0, SIZE-1);//比较排序函数,传入数组,数组头和尾index
	dEndTime1 = clock();

	dStartTime2 = clock();
	compare2(all2);
	dEndTime2 = clock();


	/*cout <<"\n"<< "排序后输出:"<<"\n";
	for (int i = 0; i < SIZE; i++)
	{
		cout  << "\t" << all[i];
		if ( (i+1) % 10 == 0)
			cout << "\n";
	}*/
	usetime1 = (dEndTime1 - dStartTime1) / CLOCKS_PER_SEC;
	usetime2 = (dEndTime2 - dStartTime2) / CLOCKS_PER_SEC;
	printf("\n快速排序法所用时间: %.3f Sec\n",usetime1);
	printf("\n冒泡排序法所用时间: %.3f Sec\n", usetime2);

    return 0;
}


//快速排序算法
void compare1(int* all,int pos1,int pos2)
{
	int size = pos2 - pos1 + 1;
	int standard = all[pos1];
	int size1 = 0;
	int size2 = 0;
	int* half1 = new int[size - 1];//存放子序列
	int* half2 = new int[size - 1];
	for (int index = 1; index < size; index++)
	{
		if (all[pos1 + index] <= standard)
		{
			half1[size1] = all[pos1 + index];
			size1++;
		}
		else
		{
			half2[size2] = all[pos1 + index];
			size2++;
		}
	}
	if (size1 > 0)
	{
		for (int i = 0; i < size1; i++)
			all[pos1 + i] = half1[i];
		all[pos1 + size1] = standard;
		compare1(all, pos1, pos1 + size1 - 1);//对子序列递归调用
	}
	if (size2 > 0)
	{
		for (int j = 0; j < size2; j++)
			all[pos2 - j] = half2[j];
		compare1(all, pos2 - size2 + 1, pos2);//对子序列递归调用
	}
	delete [] half1;//注意释放内存,防止泄露
	delete [] half2;


}

//冒泡排序算法
void compare2(int* all)
{
	int i, j, temp;
	for (j = 0; j < SIZE; j++)
	{
		for (i = 0; i < SIZE - j; i++)
		{
			if (all[i] > all[i + 1])
			{
				temp = all[i];
				all[i] = all[i + 1];
				all[i + 1] = temp;
			}
		}
	}
}


我们设置数组长度分别为1000,10000,100000,得到的结果如下:





当数组长度很大时,快速排序算法比冒泡法效率高得多。











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值