算法排序_归并排序
归并排序
归并操作归并操作(merge),也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法。
如 设有数列{6,202,100,301,38,8,1}
初始状态:6,202,100,301,38,8,1
第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3;
第二次归并后:{6,100,202,301},{1,8,38},比较次数:4;
第三次归并后:{1,6,8,38,100,202,301},比较次数:4;
总的比较次数为:3+4+4=11;
图片演示
代码实现:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374#include <stdio.h>#include <stdlib.h>#include <string.h>void merge (int *a,int lo ...
算法排序_堆排序
堆排序
堆定义n个关键字序列Kl,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质):
(1)ki<=k(2i)且ki<=k(2i+1)(1≤i≤ n/2),当然,这是小根堆,大根堆则换成>=号(2)ki>=k(2i)且ki>=k(2i+1)(1≤i≤ n/2)。k(i)相当于二叉树的非叶子结点,K(2i)则是左子节点,k(2i+1)是右子节点
若将此序列所存储的向量R[1..n]看做是一棵**完全二叉树**的存储结构,则堆实质上是满足如下性质的完全二叉树:
树中任一非叶子结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。
【例】关键字序列(10,15,56,25,30,70)和(70,56,30,25,15,10)分别满足堆性质(1)和(2),故它们均是堆,其对应的完全二叉树分别如小根堆示例和大根堆示例所示。
大根堆和小根堆:根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最小者的堆称为小根堆,又称最小堆。根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆,又称最大堆。注意:①堆中任一子树 ...
算法排序_快速排序
快速排序
基本简介快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。
它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
算法描述设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于key的值A[j],将A[j]和A[i]的值交换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于 ...
算法排序_插入排序
插入排序
基本思想:
插入排序的工作方式像许多人排序一手扑克牌。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。拿在左手上的牌总是排序好的,原来这些牌是桌子上牌堆中顶部的牌 。插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序。
实例:
c语言代码实现:
12345678910111213141516171819202122232425262728293031#include <stdio.h>#include <stdlib.h>int main (){ int a[]={5,6,8,7,1,3,2,9}; int len = sizeof(a)/sizeof(a[0]); ...
查找_二分法
二分法
以下是我第一次写的二分法c
123456789101112131415161718192021222324252627int search(int key,int a[],int length){ int left=0; int right=length-1; int sem = -1; //设置变量判断 while (right > left){ int x = (left + right)/2; //x为数组中间的值(mid) if (a[x]==key){ sem = 1; }else if (a[x]<key){ left = x + 1; } else { right = x - 1; //二分法分 } }return sem;}int main (){ int a[]=& ...
算法排序_选择排序
选择排序
原理:对数组进行数组长度大小i的遍历,每次遍历找出最小或最大的那个值与第i个数交换位置(即第一次与第一个数交换,第二次与第二个数交换,第i次与第i个数交换)。
c语言代码实现:
12345678910111213141516171819202122232425262728#include <stdio.h>#include <stdlib.h>int main(){ int a[]={3,1,6,8,4,2,9}; int len = sizeof(a)/sizeof(a[0]); for (int k=0;k<len ;k++){ printf("%d ",a[k]); } printf("\n"); // 这里做遍历为了调试看初始a数组 for (int i =0 ;i<len ;i++){ for (int j= i+1;j<l ...
汉诺塔问题
汉诺塔
来源汉诺塔(又称河内塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。解答结果恰如上题,面对庞大的数字(移动圆片的次数)18446744073709551615,看来,众僧们耗尽毕生精力也不可能完成金片的移动。后来,这个传说就演变为汉诺塔游戏:
有三根杆子A,B,C。A杆上有若干碟子
每次移动一块碟子,小的只能叠在大的上面
把所有碟子从A杆全部移到C杆上
动态演示:
经过研究不难发现:
假设有n块木块,记移动的次数为f(n) ,则f(n)=2f(n-1) +1;具体可见代码
基于c语言代码实现:
1234567891011121314151617181920212223242526// 汉诺塔问题 #include <stdio.h>#include <stdlib.h>/*算法思想:递归1.将物块 ...
算法排序_冒泡排序
排序
冒泡排序12345678910111213141516171819202122void bubble(int a[],int length ){ for (int j = 0;j < length - 1;j++){ //外循环表示循环趟数 for (int i = 0;i < length - 1;i++){ //内循环:从a[0]开始比较 int MiddleExample; if (a[i]>a[i+1]){ MiddleExample =a [i]; a[i] =a [i+1]; a[i+1] = MiddleExample;//利用中间变量交换下标顺序 } } } }// exampleint main (){ int a []={3,9,5,6,7,45,36,88}; ...
我的第一篇博客
算法效率
时间复杂度:
一般采用大O表示法,
时间复杂度的公式是: T(n) = O( f(n) ),其中f(n) 表示每行代码执行次数之和,而 O 表示正比例关系,这个公式的全称是:算法的渐进时间复杂度。
常见的时间复杂度量级有:
常数阶O(1)
12345int i = 1;int j = 2;i++;++j;int m = i + j;
上述代码即使有几十几万行,消耗的时间也不会随着某一变量的增长而增长。
对数阶O(logN)
12345int i = 1;while (i<n){ i = i * 2; i++;}
while 代码里会循环n-1次,则不妨记x次后 i >=n,即2^x = n,解的 x = log2^n.
线性阶O(n)
123for (int i = 0; i < n;i++){ sum = sum + i;}
for 循环内会执行n次,则 消耗的时间会随n的增大而增大。
线性对数阶O(nlogN)
123456for ( in ...
Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
Quick StartCreate a new post1$ hexo new "My New Post"
More info: Writing
Run server1$ hexo server
More info: Server
Generate static files1$ hexo generate
More info: Generating
Deploy to remote sites1$ hexo deploy
More info: Deployment