排序
文章平均质量分 51
进修中的涵涵涵
acm退役选手
acm icpc 金
dota爱好者
展开
-
选择排序,冒泡排序,双向冒泡排序
接上一篇博文 各种插入排序 继续写排序下面三种都是O(n^2) 选择排序 首先是选择排序, 原理: 1 找到未排序的数中最小的数放到最前面 2 数组后移一位 3 重复上面两部。 void Selectsorting() { for(int i=0;i<MAX;i++) { int min=b[i],t; for(int j=i+1;j<MAX;j++) {原创 2017-06-11 20:50:54 · 484 阅读 · 0 评论 -
堆排序(最大堆)
首先堆是什么? 堆是一种完全二叉树。 现在我们要利用堆进行排序操作,所以需要的是一种特殊的完全二叉树最大堆。 (当然用最小堆也可以做到,方法是每次取出h[1]的数,然后将h[n]赋值给h[1],同时 n--,不断的进行这个操作直到堆空) 用最大堆的做法就是 1 建立一个最大堆 2 将h[1]与h[n]交换,同时n-- //因为h[1]必定是最大值 3 维护最大堆 4 重复2,原创 2017-06-11 22:23:51 · 736 阅读 · 0 评论 -
快速排序
快速排序 此之前都是用sort(stl大法好) 一直知道原理,但是只写过一次发现手写的没stl里的快(里面加入了各种深度优化) 快排原理:先定一个目标数,然后把比它小的放在它左边,比它大的放在它右边,进行分治。最后每个分块都只有一个数那么排序OK了。 代码: #include #include #include #include #define MAX 16 int q[20]; voi原创 2017-06-12 19:03:44 · 283 阅读 · 0 评论 -
归并排序
归并排序 归并排序算是对分治算法的一种运用。 时间复杂度为O(nlogn)也是一种比较快速的排序算法 首先将代排序的数递归分化成多个小区间,那么我们可以默认,只有一个数的区间是已经排好序的 然后进行合并。 递归分化的代码: void Mergesort(int l,int r) { if(l>=r) return; int mid=(l+r)>>1; /原创 2017-06-12 19:35:12 · 299 阅读 · 0 评论 -
直接插入排序,二分(折半)插入排序,希尔插入排序
老师布置让写一个n^2的排序算法和一个nlogn的排序算法。 刚好把排序算法整理一下。 首先是最基本的直接插入排序。 直接插入排序 原理:把待排序的数插入到已经排序好的有序序列中。 比如 V[0]V[1]...V[N-1]是一个有序序列,现在插入 V[N]; 那么需要逐个比较与V[N]的大小,大的向后移。 总的来说就是不断的交换。 时间复杂度为 O(n^2). void swap原创 2017-06-11 20:04:11 · 497 阅读 · 0 评论