插入排序与归并排序

插入排序的算法原理比较简单,通过构建有序序列来达到排序的目的。比如给出一个数组a,那么首先会将第一个元素作为一个已经排序的序列,然后从第二个元素开始向已经排序的序列(就是第一个元素)从后向前扫描,如果比这个序列中的元素小的话,就插入到相应元素的前面,然后第三个元素再从这两个元素组成的有序序列的后面扫描,找到比它小的位置后就插入,否则结束扫描,以此类推。时间复杂度为O(n*n).
归并排序的时间效率为O(n * log n),归并排序(MergeSort)的基本思想是:将待排序文件看成为n个长度为1的有序子文件,把这些子文件两两归并,使得到「n/2」个长度为2的有序子文件;然后再把这「n/2」个有序文件的子文件两两归并,如此反复,直到最后得到一个长度为n的有序文件为止,这种排序方法成为二路归并排序。
插入排序具有空间原址性,任何时候都只需要常数个额外元素空间存储临时数据,但时间复杂度高,而归并排序算法时间复杂度低,但的空间效率不高,需要多耗费一倍的空间。


//插入排序
public void sort(int a[]){
for(int j = 1;j < a.length;j++){
int temp = a[j];
int i = j-1;
while((i>=0)&&(a[i]>temp)){
a[i+1] = a[i];
i = i-1;
}
a[i+1] = temp;
}

}




//归并排序
public void sort(int a[]){
for(int j = 1;j < a.length;j++){
int temp = a[j];
int i = j-1;
while((i>=0)&&(a[i]>temp)){
a[i+1] = a[i];
i = i-1;
}
a[i+1] = temp;
}
public void merge(int a[],int p,int q,int r){
int n1 = q-p+1;
int n2 = r-q;
int []b1 = new int[n1+1];
int []b2 = new int[n2+1];
for(int i = 0;i < n1;i++){
b1[i] = a[p+i];
}
for(int j = 0;j < n2;j++){
b2[j] = a[q+j+1];
}
b1[n1] = Integer.MAX_VALUE;
b2[n2] = Integer.MAX_VALUE;
sort(b1);
sort(b2);

int i = 0;
int j = 0;
for(int k = p;k<=r;k++){
if(b1[i]<b2[j]){
a[k] = b1[i];
i++;
}else{
a[k] = b2[j];
j++;
}
}
}

public void mergeSort(int [] a,int p,int r){
if(p<r){
int q = (p+r)/2;
mergeSort(a, p, q);
mergeSort(a, q+1, r);
merge(a, p, q, r);

}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值