插入:

    template<typename DataType>void insert(DataType D[], int length) {DataType key;for (int j = 2; j < length; j++) {key = D[j];//先保存D[j]的位置,因为它可能会被替换int i = j - 1;while (i > 0 && D[i] > key) {D[i + 1] = D[i];//如果在j前面的元素比该元素大,将该元素后移动一个位置i--;//i继续前移进行扫描,直到它刚好大于它前面的元素 小于它后面的元素}D[i+1] = key;//插入刚刚的key值 注意是i+1}
}//们将D[0]作为哨兵元素,存储待排序元素

冒泡:

#include<stdio.h>
#include<time.h>
void swap(int& a, int& b) {int t;t = a;a = b;b = t;
}
void bubble(int a[], int n) {int i = n - 1;//i是下一趟需要参与排序交换的元素的最大下标while (i > 0) {int minindext = 0;//设置一开始的标志是0for (int j = 0; j < i; j++) {if (a[j + 1] < a[j]) {swap(a[j + 1], a[j]);}minindext = j;//此时为交换之后更小的元素的索引}i = minindext;}
}
int main()
{int a[1000] = { 0 };for (int i = 0; i < 1000; i++){a[i] = rand() % 1000 + 1;}bubble(a, 1000);for (int i = 0; i < 1000; i++){cout<<a[i]<<",";}printf("Time used = %.2f\n", (double)clock() / CLOCKS_PER_SEC);
}

注意:如果不写swap函数,而是直接在bubble函数中交换两个数字,发现它们最后并没有发生交换。

快速排序:

template<class T> int partition(T data[], int p, int r) {int i = p - 1; int j = p;for (j = p; j < r; j++) {if (data[j] <= data[r]) {i++;swap(data[i], data[j]);}}swap(data[i+1], data[r]);return i + 1;
}
template <class T>
void quickSort(T data[], int p, int r) {int position = 0;if (p < r) {position = partition(data, p, r);quickSort(data, p, position - 1);quickSort(data, position+1, r);}
}int main()
{int a[1000] = { 0 };for (int i = 0; i < 1000; i++){a[i] = rand() % 1000 + 1;}quickSort(a, 0,999);for (int i = 0; i < 1000; i++){cout<<a[i]<<",";}printf("Time used = %.2f\n", (double)clock() / CLOCKS_PER_SEC);
}

易错点:swap(data[i+1], data[r]);
return i + 1;注意是i+1 ,如果写成i无法排序
我们设置变量p 和r 表示数组的首尾元素下标,选取数组最右边的元素为我们第一次排序的划界元素,记为S[r]。那么我们就需要将S[p],S[p+1],…,S[r–1]组成的序列进行子序列划分
我们设置变量i=p–1,即最前面元素的前一个,设置变量j = p。反复执行如下步骤:
(1)执行j+1,如果S[j]≤S[r],交换S[i+1]与S[j]的值,i=i+1,j=j+1;如果S[j]≥S[r],i 不变,j=j+1;
(2)到j=r–1 时,停止步骤(1)。
重复执行上述步骤直至停止后,交换S[i+1]与S[r]的值,划界元素放在了其最终位置上,其左边的元素均小于等于它,右边的元素均大于它。

归并排序:

void merge(int aa[], int b [], int c[],int lenA, int lenB) {int count = 0;int i = 0, j = 0;while (count < lenA + lenB) {if (aa[i] < b[j]) {c[count] = aa[i];count++;i++;}else {c[count] = b[j];count++;j++;}if (i == lenA) {while (j < lenB) {c[count] = b[j];count++;j++;}}else if(j == lenB){while (i < lenA) {c[count] = aa[i];count++;i++;}}}
}void mergesort(int a[], int n) {if (n > 1) //记得要加判断条件n>1{int* b = new int[n / 2];int* c = new int[n - n / 2];for (int i = 0; i < n / 2; i++) {b[i] = a[i];}int k = n / 2;for (int j = 0; j < n - n / 2; j++) {c[j] = a[j + k];}mergesort(b, n / 2);mergesort(c, n - n / 2);merge(b, c, a, n / 2, n - n / 2);}
}
int main()
{int a[1000] = { 0 };for (int i = 0; i < 1000; i++){a[i] = rand() % 1000 + 1;}mergesort(a, 1000);for (int i = 0; i < 1000; i++){cout << a[i] << ",";}printf("Time used = %.2f\n", (double)clock() / CLOCKS_PER_SEC);
}

归并排序是排序两个已经排序好了的数组,原数组要先拆成两个子数组,
注意:一定不能遗漏对于i和j达到a或者b末尾的判断,否则会出现乱码。当i到达a的末尾,则遍历b剩下的数组直接赋给c

跟之前的对比归并排序时间是最长的。

【练习】不同排序算法执行时间比较相关推荐

  1. 排序算法--(冒泡排序,插入排序,选择排序,归并排序,快速排序,桶排序,计数排序,基数排序)

    一.时间复杂度分析 - **时间复杂度**:对排序数据的总的操作次数.反应当n变化时,操作次数呈现什么规律 - **空间复杂度**:算法在计算机内执行时所需要的存储空间的容量,它也是数据规模n的函数. ...

  2. 【项目】C语言实现对英文文本按字典顺序排序(1~100万+个单词,多种排序算法选择)

    目录 介绍 算法代码与exe程序 基本功能 完整功能 函数总览 运行实例(10万个单词的英文文本排序) 参考文献 介绍 对含有多个单词的英文文本,选择多个排序算法,将所有单词按字典顺序排序,并实时显示 ...

  3. 排序算法中——归并排序和快速排序

    冒泡排序.插入排序.选择排序这三种算法的时间复杂度都为 $O(n^2)$,只适合小规模的数据.今天,我们来认识两种时间复杂度为 $O(nlogn)$ 的排序算法--归并排序(Merge Sort)和快 ...

  4. 我的Java开发学习之旅------gt;Java经典排序算法之希尔排序

    一.希尔排序(Shell Sort) 希尔排序(Shell Sort)是一种插入排序算法,因D.L.Shell于1959年提出而得名. Shell排序又称作缩小增量排序. 二.希尔排序的基本思想 希尔 ...

  5. 我的Java开发学习之旅------Java经典排序算法之希尔排序

    一.希尔排序(Shell Sort) 希尔排序(Shell Sort)是一种插入排序算法,因D.L.Shell于1959年提出而得名. Shell排序又称作缩小增量排序. 二.希尔排序的基本思想 希尔 ...

  6. python制作酷炫动画_厉害了!Python+matplotlib制作8个排序算法的动画

    1 算法的魅力 深刻研究排序算法是入门算法较为好的一种方法,现在还记得4年前手动实现常见8种排序算法,通过随机生成一些数据,逐个校验代码实现的排序过程是否与预期的一致,越做越有劲,越有劲越想去研究,公 ...

  7. 各种排序算法及其java程序实现

    原文:http://blog.csdn.net/t12x3456/article/details/7430700 各种排序算法:冒择路(入)兮(稀)快归堆,桶式排序,基数排序 冒泡排序,选择排序,插入 ...

  8. 【算法入门】用Python手写五大经典排序算法,看完这篇终于懂了!

    算法作为程序员的必修课,是每位程序员必须掌握的基础.作为Python忠实爱好者,本篇将通过Python来手撕5大经典排序算法,结合例图剖析内部实现逻辑,对比每种算法各自的优缺点和应用点.相信我,耐心看 ...

  9. 厉害了!Python+matplotlib制作8个排序算法的动画

    文章来源于Python与算法社区,作者zglg 1 算法的魅力 深刻研究排序算法是入门算法较为好的一种方法,现在还记得4年前手动实现常见8种排序算法,通过随机生成一些数据,逐个校验代码实现的排序过程是 ...

最新文章

  1. 高性能NIO框架Netty入门篇
  2. python3安装-Centos 安装 Python3
  3. Linux下profile和bashrc四种的区别
  4. 计算机三级网络操作题,计算机等级考试三级网络技术考试模拟试题
  5. 互掐盗播风云再起 三大视频网站存和解可能
  6. 安装程序将在重启您的计算机后黑屏,安装windows10一直黑屏怎么解决_win10安装到一半黑屏修复方法...
  7. 函数 写函数时需要:1明确这个功能的结果是什么? 2这个功能实现过程中是否需要未知内容参与运算?...
  8. iOS底层探索之dyld(下):动态链接器流程源码分析
  9. TCP/IP源码分析
  10. python查询手机号码归属地
  11. 如何赋能传统制造业数字化转型升级?
  12. 从一循环到150,并在每行打印一个值,另外在每个3的倍数行上打印出“foo“,在5的倍数行打印biz,在7的倍数行打印baz
  13. python之动态性
  14. webpack4 学习时打包图片时遇到的问题
  15. TDengine 单节点Cluster not ready( 群集未就绪) 异常问题分析及解决方案
  16. 使用java的milo框架访问OPCUA服务的方法
  17. 高德地图628一元购狂欢节——O2O 不是说说而已
  18. 苏宁API接口介绍,item_get - 获得suning商品详情
  19. SpringSecurity(八)【RememberMe记住我】
  20. 复制后的图形将文字覆盖上了【已解决】

热门文章

  1. python安装vpython_VPython:一个Python的3D图形动画库+被忽略的数据可视化功能
  2. SpringMVC_2.搭建SpringMVC
  3. php编译优化,浅析使用Turck-mmcache编译来加速、优化PHP代码
  4. 标定中是什么意思_机械加工中,测头有什么作用呢?
  5. 小学毕业能学php吗,将来没出息的娃,多半从小就有这些缺点,小学毕业前还不改就晚了...
  6. python列表_Python中列表(list)操作方法汇总
  7. 五十、opencv调用USB摄像头并保存图片
  8. 五十三、Java的记录日志Log4j框架的使用
  9. 四、爬虫中的urllib库使用
  10. KDD 2020 开源论文 | 稀疏优化的块分解算法