插入排序和分治排序
来源:互联网 发布:视频后期音乐软件 编辑:程序博客网 时间:2024/05/17 09:40
What’s more important than performance?
> modularity
> correctness
> maintainability
> functionality
> robustness
> user-friendliness
> programmer time
> simplicity
> extensibility
> reliability
Why study algorithms and performance?
> Algorithms help us to understand scalability.
> Performance often draws the line between what is feasible and what is impossible.
> Algorithmic mathematics provides a language for talking about program behavior.
> The lessons of program performance generalize to other computing resources.
> Speed is fun!
插入排序法(少量数据排序较好,是一种增量排序方法):O(n2)
说明:缩进代表程序结构,三角形代表注释,箭头表示赋值。
Running time
• The running time depends on the input: an already sorted sequence is easier to sort.
• Parameterize the running time by the size of the input, since short sequences are easier to sort than long ones.
• Generally, we seek upper bounds on the running time, because everybody likes a Guarantee.
Kinds of analyses
Worst-case: (usually)
• T(n) = maximum time of algorithm on any input of size n.
Average-case: (sometimes)
• T(n) = expected time of algorithm over all inputs of size n.
• Need assumption of statistical distribution of inputs.
Best-case: (bogus)
• Cheat with a slow algorithm that works fast on some input
分治排序:O(nlogn)(是一种分结合并算法或递归算法)
算法:
时间复杂度:
可以证明,其复杂度为O(nlogn)。
下面看一个例子:
有这样一组数据,{5,4,1,22,12,32,45,21},如果对它进行合并排序的话,首先将它从中间分开,这样,它就被分成了两个数组{5,4,1,22} {12,32,45,21}.
对这两个数组,也分别进行这样的操作,逐步的划分,直到不能再划分为止(每个子数组只剩下一个元素),这样,划分的过程就结束了。
划分的过程如下图所示:
接下来,我们进行合并操作,依照上图,划分过程是从上到下进行的,而合并的过程是从下往上进行的,例如上图中,最下层{5},{4}这两个数组,如果按升序排列,将他们合并后的数组就是{4,5}。{1},{22}这两个子数组合并后是{1,22}。而{4,5}与{1,22},这两个数组同属一个分支,他们也需要进行合并,由于这两个子数组本身就是有序的,所以合并的过程就是,每次从待合并的两个子数组中选取一个最小的元素,然后把这个元素放到合并后的数组中,前面两个数组合并后就是{1,4,5,22}。依次类推,直到合并到最上层结束,这是数据的排序已经完成了。
合并的过程如下图所示。这个过程是从下往上的。
C语言实现代码如下:
1#include <stdlib.h> 2 3//合并过程 4void merge(int data[],int start,int mid,int end){ 5 6 7 int *tmpLeft,*tmpRight; 8 int leftSize,rightSize; 9 int l,r,j;1011 printArray(data,8);12 printf("\n");13 l = 0;14 r = 0;15 j = 0;16 leftSize = mid - start + 1;17 rightSize = end - mid;1819 tmpLeft = (int *)malloc(leftSize * sizeof(int));20 tmpRight = (int *)malloc(rightSize * sizeof(int));2122 while(j < leftSize){23 tmpLeft[j] = data[start + j];24 j++;25 }2627 j = 0;2829 while(j < rightSize){30 tmpRight[j] = data[mid + 1 + j];31 j++;32 }3334 j = 0;3536 while(l < leftSize && r < rightSize){37 if(tmpLeft[l] < tmpRight[r]){3839 data[start + j++] = tmpLeft[l++];4041 }else{4243 data[start + j++] = tmpRight[r++];44 }45 }4647 while(l < leftSize){48 data[start + j++] = tmpLeft[l++];49 }5051 while(r < rightSize){52 data[start + j++] = tmpRight[r++];53 }5455 free(tmpLeft);56 free(tmpRight);57}585960void merge_sort(int data[],int start,int end){6162 int mid;63 if(start < end){64 //将数组划分65 mid = (start + end) / 2;66 merge_sort(data,start,mid);67 merge_sort(data,mid + 1,end);68 //合并划分后的两个数组69 merge(data,start,mid,end);70 }7172}
- 插入排序和分治排序
- 排序算法:插入排序\分治法
- 插入排序 和 归并排序(分治)的c实现和时间复杂度分析
- 数组排序问题的两种方法:插入排序算法和递归(分治)算法
- 【算法导论】 第二章 插入排序、分治排序
- 排序第一站,插入排序与分治算法
- 插入排序和希尔排序
- 快速排序和插入排序
- 插入排序和选择排序
- 插入排序和快速排序
- 插入排序和希尔排序
- 插入排序 和 快速排序
- 选择排序和插入排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 归并排序和插入排序
- 选择排序和插入排序
- 选择排序和插入排序
- 如何意识到问题的存在——读《你的灯还亮着吗》
- 毕业了,我们干什么?
- 图像的几何变换
- vs2008下cannot convert parameter 1 from 'LPCTSTR' to 'const char *'的解决方法
- OpenCV 卡尔曼滤波器的使用
- 插入排序和分治排序
- UNIX环境高级编程读书笔记
- Linux 编程经典书籍推荐
- VC++多线程编程
- toread:将网页一键发送到邮箱的服务
- 常用排序算法
- Kalman Filters in the MRPT and using tips
- Paticle Filter in MRPT and using tips
- MRPT data formats and serialization