算法是程序的灵魂,无论学习什么语言,做什么工程项目,都要考虑算法的效率实现,本系列主要列举最基础的十大应用算法以及个人的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,得到的结果如下:
当数组长度很大时,快速排序算法比冒泡法效率高得多。