【算法学习】排序算法-合并排序
2014-11-28 23:39
344 查看
思想:
将有序表合并为一个大的有序表,有序表的规模一次为1,2,4,...C代码
#include "stdio.h"#include "stdlib.h"
void array_print(int a[],int n );
void sort_merge(int a[],int n);
int merge(int a[],int temp[],int start,int len,int n);
void main(){
int a[]={3,1,18,30,12,11,18,43,-1,-2,-100};
int n = sizeof(a)/sizeof(int);
sort_merge(a,n);
array_print(a,n);
}
void sort_merge(int a[],int n){
//merge sort use extra memory of same size for sorting
// make the size of merging double times
int *temp = (int*)malloc(n*sizeof(int));
int len = 1;
int i ;
while(len <= n){
i=0;
while(i<n)
i = merge(a,temp,i,len,n);
len *=2;
}
free(temp);
}
int merge(int a[],int temp[],int start,int len,int n){
int s1,e1,s2,e2,size_this_compare,i;
s1 = start;
e1 = start + len -1 ;
if( e1 >= n-1 )
return n;
s2 = e1 + 1;
e2 = s2+len-1 < n-1 ? s2+len-1 :n-1;
size_this_compare = e2 - s1 +1;
i=start;
while( s1<=e1 && s2<=e2){
while(s1<=e1 && a[s1]<=a[s2])
temp[i++] = a[s1++];
while(s2<=e2 && a[s2]<=a[s1])
temp[i++] = a[s2++];
}
while(s1<=e1) temp[i++] = a[s1++];
while(s2<=e2) temp[i++] = a[s2++];
while(i>=start){
i--;
a[i]=temp[i];
}
return e2+1;
}
void array_print(int a[],int n ){
int i;
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
Java代码
import java.util.ArrayList;import java.util.List;
public class SortMerge implements Sort {
@Override
public void sort(List<Integer> source) {
int len =1;
int n = source.size();
while(len < n){
int s1,e1,s2,e2;
e2=-1;
while(true){
s1 = e2+1;
e1 = s1+len-1;
if(e1 >= n-1) break;
s2 = e1+1;
e2 = s2+len-1 < n-1 ? s2+len-1 : n-1;
merge(source, s1, e1, s2, e2);
}
len *=2;
}
}
private void merge(List<Integer> source , int s1, int e1, int s2,int e2){
int t1=s1,t2=s2,i=0;
List<Integer> temp = new ArrayList<>();
while( t1<=e1 && t2<=e2){
while(t1<=e1 && source.get(t1)<=source.get(t2) ) {
temp.add(source.get(t1));
i++;
t1++;
}
while(t2<=e2 && source.get(t2)<=source.get(t1)){
temp.add(source.get(t2));
i++;
t2++;
}
}
while(t1<=e1){
temp.add(source.get(t1));
i++;
t1++;
}
while(t2<=e2){
temp.add(source.get(t2));
i++;
t2++;
}
i--;
while(i>=0){
source.set(e2, temp.get(i));
i--;
e2--;
}
}
}
相关文章推荐
- 【算法学习】浅谈排序算法
- C#数据结构和算法学习系列四----基础排序算法
- 【算法学习】排序算法-希尔排序
- 学习算法第二篇:排序算法
- 学习算法第一篇:排序算法
- 算法导论之排序算法学习
- 算法基本知识学习之排序算法
- 算法导论—排序算法学习(1)
- 算法学习之排序算法(四)(希尔排序)
- 【算法学习】排序算法-冒泡排序
- STL学习笔记----14.STL算法之 (排序算法)
- STL学习笔记----14.STL算法之 (排序算法)
- 算法设计和数据结构学习_2(常见排序算法思想)
- 【算法学习】排序算法-堆排序
- 算法学习----各种排序算法的实现和对比1
- 算法学习-排序算法-快速排序
- [算法学习]常用排序算法实现
- 算法分析学习笔记(三) - 排序算法(上)
- 算法学习笔记:排序算法整理
- 算法学习第一幕:排序算法1