十大基础应用算法及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,得到的结果如下:
当数组长度很大时,快速排序算法比冒泡法效率高得多。
阅读全文
0 0
- 十大基础应用算法及C++实现(一)----快速排序算法
- 十大基础应用算法及C++实现(二)----堆排序算法
- 用JavaScript实现十大经典排序算法--快速排序
- 十大算法系列之(一)——快速排序
- 十大经典排序算法(一)
- C/C++十大经典算法之快速排序
- 十大排序算法(java实现)
- 十大排序算法实现
- 十大基础实用算法补全——快速排序(QuickSort)
- 排序算法(C实现)--------- 快速排序
- 基础算法--C快速排序
- Java十大经典基础排序算法
- 常用排序算法之快速排序c及lua实现
- 十大基础实用算法之快速排序和堆排序
- 快速排序算法及实现
- 快速排序算法及实现
- 快速排序算法实现(C++)
- 快速排序算法(C & Java 实现)
- Spring-Boot学习笔记(四)JDBC使用
- 【Keystone】token
- 12个常用的JavaScript简写技巧
- 浅谈Three.js源码-render之WebGLState.js(重要)
- FSDataOutputStream (浅析hadoop写入数据api)
- 十大基础应用算法及C++实现(一)----快速排序算法
- poj1386 Play on Words【欧拉图】
- 学习日记1
- 浅谈ARP
- SVO深度解析(三)之深度滤波(建图部分)
- maven 打可执行包--就是打出来的包中 包含第三方依赖包的 jar文件
- C++动态规划算法之采药
- QT 菜单栏 工具栏 Qaction的创建
- Android 自定义通用Dialog的封装