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

来源:互联网 发布:遗传算法视频讲解 编辑:程序博客网 时间:2024/05/29 07:23

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

算法一:快速排序算法

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

先来一个简单实现:

#include "stdafx.h"#include <iostream>#define SIZE 10int 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);//比较排序函数,传入数组,数组头和尾indexcout << "排序后输出:";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 100000int 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 Timecompare1(all1, 0, SIZE-1);//比较排序函数,传入数组,数组头和尾indexdEndTime1 = 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,得到的结果如下:





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











原创粉丝点击