上一页 1 ··· 70 71 72 73 74 75 76 77 78 ··· 103 下一页
摘要: 快速排序时间复杂度为O(nlogn),由于是在原数组上面利用替换来实现,因此不需要额外的存储空间。算法思想: 通过设置一个岗哨,每次跟这个岗哨进行比较,比他小的放在左边,比他大的放在右边。再对岗哨左边的数组0----middle-1,和middle+1-----end,进行同样的排序。主要代码:v... 阅读全文
posted @ 2014-04-21 14:42 xingoo 阅读(894) 评论(0) 推荐(2)
摘要: 非递归版的归并排序,省略了中间的栈空间,直接申请一段O(n)的地址空间即可,因此空间复杂度为O(n),时间复杂度为O(nlogn);算法思想: 开始以间隔为1的进行归并,也就是说,第一个元素跟第二个进行归并。第三个与第四个进行归并; 然后,再以间隔为2的进行归并,1-4进行归并,5-8进行归并;... 阅读全文
posted @ 2014-04-17 19:57 xingoo 阅读(12395) 评论(1) 推荐(4)
摘要: 递归版的合并排序,时间复杂度为O(nlogn),空间复杂度为O(n+logn);算法思想: 利用分而自治的思想,把排序分成两块,每块内部排序,再进行一次遍历排序即可,递归调用此过程即可。主要代码:void MergeSort(int *arr,int length){ Msort(arr,a... 阅读全文
posted @ 2014-04-17 16:53 xingoo 阅读(1833) 评论(0) 推荐(0)
摘要: 构建堆的时间复杂度为O(n),而第I次调整堆的时间复杂度为O(logi),因此,无论什么情况下时间复杂度都为O(nlogn)。算法思想: 首先,对数组从n/2处开始进行创建堆。大顶堆就是顶点总是大于它的子节点,而小顶堆就是定点总是小于它的子节点。 因此,构建时,对节点与他的孩子进行比较,如果创建... 阅读全文
posted @ 2014-04-14 17:34 xingoo 阅读(525) 评论(0) 推荐(0)
摘要: 希尔排序的时间复杂度,最好的情况下仍然是正序时,可达到O(n),平均复杂度为O(nlogn)。算法思想: 采用跳跃式处理数组,使得数组粗粒度的实现基本有序。在进行细粒度的处理,最终使得网络在跳越数为1时,实现基本有序的排序,以减少插入排序的复杂度。主要程序:void shellSort(int *... 阅读全文
posted @ 2014-04-14 15:03 xingoo 阅读(583) 评论(0) 推荐(0)
摘要: 时间复杂度:如果排序的数组是正序的,那么时间复杂度相当于O(n),而如果排序是随机的,时间复杂度相当于O(n^2/4).倒置的时间复杂度是最高的,O(n^2).算法思想: 该算法是设置了一个中间存储,每次读到的数据存储到中间值。向前遍历,如果大于这个值,继续向前,每次向前遍历时,把数据向后移,最后... 阅读全文
posted @ 2014-04-14 08:52 xingoo 阅读(515) 评论(0) 推荐(0)
摘要: 选择排序时间复杂度也为O(n^2)算法思想:选择排序即每次length-i的长度内选择一个最小的元素,与第一个进行替换,这样大循环length次后,就可以得到排好序的数组了。主要代码:void selectSort(int *arr,int length){ int i,j,k,min; for(i=0;i#include int arrtest[10] = {3,4,7,8,0,9,1,2,6,5};//int arrtest[10] = {0,1,2,3,4,5,6,7,8,9};//int arrtest[10] = {9,8,7,6,5,4,3,2,1,0};void co... 阅读全文
posted @ 2014-04-09 16:44 xingoo 阅读(338) 评论(0) 推荐(1)
摘要: 冒泡排序时间复杂度上为O(n^2)冒泡排序三种方式,第一种也是最基本的排序:void bubbleSort1(int *arr,int length){ int i,j,k; for(i=0;iarr[j]){ k = arr[j]; arr[j] = arr[i]; arr[i] = k; } } }}第二种是循环的时候,j指针从尾部开始,每次可以顺便排序其他的元素void bubbleSort2(int *arr,int length){ i... 阅读全文
posted @ 2014-04-09 16:29 xingoo 阅读(902) 评论(0) 推荐(0)
摘要: 算法思想二叉排序树,删除操作主要针对三种情况。1 叶子节点-直接删除就可以了2 没有左孩子的节点-直接嫁接右子树就可以了(没有右孩子的节点-直接嫁接左子树就可以了)3 如果左右子树都存在,则寻找删除节点的直接前驱(即左子树里面的最右的节点)编程时需要注意,函数时针对指针的操作,因此为了修改指针,要使用二级指针传参才可以例如:void delete(BinaryTree **b){ ....}int main(){ BinaryTree *b = (BinaryTree *)malloc(sizeof(BinaryTree)); delete(&b);}函数代码:bool deleteT 阅读全文
posted @ 2014-04-09 15:37 xingoo 阅读(3256) 评论(0) 推荐(0)
摘要: 在c程序中,我们可能经常会使用到指针之间的赋值。传统的赋值操作:char *cp = "c";const char *ccp;ccp = cp;printf("*ccp:%c",*ccp);会正常打印出*cpp所指的字符。但是下面的这段代码,就会出现问题:char **c = &cp;const char **cc;cc = c;printf("**cc:%c",**cc);编译的时候提示,出现错误:1>------ 已启动生成: 项目: oj1511, 配置: Debug Win32 ------1>生成启动时间 阅读全文
posted @ 2014-04-09 10:57 xingoo 阅读(1589) 评论(0) 推荐(0)
上一页 1 ··· 70 71 72 73 74 75 76 77 78 ··· 103 下一页