插入排序和归并排序
2016-05-14 23:18
190 查看
本人在CSDN的原链接http://blog.csdn.net/fonxian/article/details/46604517
算法稳定性:记录的相对在排序的过程中保持不变,排序前i在j之前(i<j),排序的过程中i始终在j之前。排序算法是否为稳定的是由具体算法决定的。
直接插入算法是稳定性算法。
一、插入排序
首先是插入排序,这个过程就可以比喻成左手放牌(已排好序),右手抓牌(牌堆上最顶端的一张牌),然后放到左手,插到正确的位置1、伪代码
for j = 2 to A.length key = A[j]; i = j - 1; while(i >0&&a[i]<key) a[i+1] = a[i]; i --; a[i+1] = key;
2、可用代码
void insert(int a[],int n){ int key; int i; for (int j = 2; j <= n; j++){ key = a[j]; i = j - 1; while (i>0 && key < a[i]){ a[i + 1] = a[i]; i--; } a[i + 1] = key; } }
3、算法复杂度分析
空间复杂度为O(1),最好的情况是O(n),最差的情况是O(n^2)算法稳定性:记录的相对在排序的过程中保持不变,排序前i在j之前(i<j),排序的过程中i始终在j之前。排序算法是否为稳定的是由具体算法决定的。
直接插入算法是稳定性算法。
二、归并排序
1、算法思想
归并排序主要用到了分治的思想。假设一个数组中的n个数,假设为10,逻辑上分成两组,即a[0]-a[4]为A组,a[5]-a[10]为B组,且A组和B组各自都是排序好的数,我们首先在每组中取出第一个数比较,即(a[0]和a[5]比较大小,若a[0]小,则将a[0]插入到临时数组temp[]中,接着a[1]再和a[5]比较大小,小的一方还是放到临时数组中)。完成合并之后,再使用递归的思想,将10个数的排序分治成每一个数字,即两个数比较大小之后合并成一组,一组两个数和另外一组的两个数合并到一组中,依次类推。2、算法实现
public static void merge(int array[],int left,int mid,int right){ int[] temp = new int[right-left+1]; int i = left,j = mid+1,k = 0; //将一个数组通过下标分成逻辑上的两组数,比较两组数A,B,数小的放到临时数组 while(i<=mid&&j<=right){ if(array[i]<array[j]) temp[k++]=array[i++]; else{ temp[k++]=array[j++]; } } //考虑到A或B数组中的数绝大多数都比另外一个数组小,则另一个数组可能会剩下一部分排好序的数 //将剩下的数放入到数组 while(i<=mid) temp[k++] = array[i++]; while(j<=right) temp[k++] = array[j++]; //将整个临时表放到原数组中 for(int n = 0,len=temp.length;n<len;n++){ array[n+left] = temp ; } } //使用到递归的思想,最小会细分到一个数为一组 //然后二个数比较大小后合并成一组一组就有两个数依次类推 public static void merge_sort(int[] array, int left, int right){ int mid; if (left < right){ mid = (left + right) / 2; merge_sort(array, left, mid); merge_sort(array, mid + 1, right); merge(array, left, mid, right); } } public static void main(String[] args) { int array[] = {20,15,47,20,13,100,1}; merge_sort(array,0,array.length-1); System.out.println(Arrays.toString(array)); }
3、算法复杂度分析
空间复杂度为O(1),最好的情况是O(nlgn),最差的情况是O(nlgn),是稳定的排序相关文章推荐
- 话说正确率、召回率和F值
- 第十二周上机实践——项目1-实现复数类中的运算符重载-(1)
- iptables 添加,删除,查看,修改
- apache2.4 + mod_proxy + tomcat7 配置集群和负载均衡
- 史上最简单的servlet项目实例
- Github Atom
- 129. Sum Root to Leaf Numbers
- 排序方法(一)
- PAT L1-6 最长连续因子
- C#.NET MVC 枚举转dictionary自动装载生成下拉框
- MySql Service 安装流程,包含解决服务无法启动 服务没有报告任何错误
- NYOJ squares(计算几何+区间覆盖)
- 转Linux下C编程实现之文件系统
- Lucene.net
- JAVA实现冒泡排序和二分查找
- NET5
- Jmeter--EN5并发测试遇到问题点
- 单页应用Scrat实践
- Java 之反射
- WEB服务器、应用程序服务器、HTTP服务器有何区别?