排序
文章平均质量分 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 · 478 阅读 · 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 · 727 阅读 · 0 评论 -
快速排序
快速排序此之前都是用sort(stl大法好)一直知道原理,但是只写过一次发现手写的没stl里的快(里面加入了各种深度优化)快排原理:先定一个目标数,然后把比它小的放在它左边,比它大的放在它右边,进行分治。最后每个分块都只有一个数那么排序OK了。代码:#include#include#include#include#define MAX 16int q[20];voi原创 2017-06-12 19:03:44 · 273 阅读 · 0 评论 -
归并排序
归并排序归并排序算是对分治算法的一种运用。时间复杂度为O(nlogn)也是一种比较快速的排序算法首先将代排序的数递归分化成多个小区间,那么我们可以默认,只有一个数的区间是已经排好序的然后进行合并。递归分化的代码:void Mergesort(int l,int r){ if(l>=r) return; int mid=(l+r)>>1; /原创 2017-06-12 19:35:12 · 289 阅读 · 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 · 482 阅读 · 0 评论