归并排序————Java实现
2011-05-27 17:17
267 查看
归并排序(MergeSort)
1、[b]思想:[/b]
多次将两个或两个以上的有序表合并成一个新的有序表。
2、算法时间复杂度
最好的情况下:一趟归并需要n次,总共需要logN次,因此为O(N*logN)
最坏的情况下,接近于平均情况下,为O(N*logN)
说明:对长度为n的文件,需进行logN 趟二路归并,每趟归并的时间为O(n),故其时间复杂度无论是在最好情况下还是在最坏情况下均是O(nlgn)。
3、[b]稳定性 [/b]
归并排序最大的特色就是它是一种稳定的排序算法。归并过程中是不会改变元素的相对位置的。
4、缺点是,它需要O(n)的额外空间。但是很适合于多链表排序。
/**
* @author Administrator
* 并归排序法
*/
public class MergeSort {
/**
* @param args
*/
public static void main(String[] args) {
int[] data = { 1, 7, 16, 21, 41, 42,46, 52 ,53,63,86,97,3,53};
mergeSort(data, 0, data.length - 1); //
printData(data);
}
private static void mergeSort(int[] data, int low, int high) {
if(low>=high){
return ;
}
int mid = (low+high)/2;
mergeSort(data,low,mid);
mergeSort(data, mid+1, high);
merge(data,low,mid,high);
}
private static void merge(int data[],int low,int mid,int high){
int [] temp = new int[high-low+1];
int key = 0 ;
int i = low;
int j = mid+1;
/**把data从low到high可以看成从mid分开的两个数组
* 分别遍历两个数组,把最小值放入临时数组
* */
for(;i<=mid && j<=high;key++){
if(data[i]>data[j]){
temp[key] = data[j];
j++;
}else{
temp[key] = data[i];
i++;
}
}
/** 若从data[low] 到 data[mid]遍历完,则可能data[min+1]到data[high]的值还未遍历完
* 并且这些值肯定比data[mid]大,且是有序的.直接追加到temp后即可 */
if(i>mid){
while(j<=high){
temp[key]=data[j];
key++;
j++;
}
}
/**同理上 */
if(j>high){
while(i<=mid){
temp[key]=data[i];
key++;
i++;
}
}
/**把temp数组的值并归回data数组 */
setData(data,temp,low);
}
private static void setData(int []data,int []temp,int low){
if(data.length<temp.length){
return ;
}else{
for(int i = 0;i<temp.length;i++){
data[low+i] = temp[i];
}
}
}
public static void printData(int[] data) {
for (int i : data) {
System.out.print(i + " ");
}
System.out.println();
}
}
1、[b]思想:[/b]
多次将两个或两个以上的有序表合并成一个新的有序表。
2、算法时间复杂度
最好的情况下:一趟归并需要n次,总共需要logN次,因此为O(N*logN)
最坏的情况下,接近于平均情况下,为O(N*logN)
说明:对长度为n的文件,需进行logN 趟二路归并,每趟归并的时间为O(n),故其时间复杂度无论是在最好情况下还是在最坏情况下均是O(nlgn)。
3、[b]稳定性 [/b]
归并排序最大的特色就是它是一种稳定的排序算法。归并过程中是不会改变元素的相对位置的。
4、缺点是,它需要O(n)的额外空间。但是很适合于多链表排序。
/**
* @author Administrator
* 并归排序法
*/
public class MergeSort {
/**
* @param args
*/
public static void main(String[] args) {
int[] data = { 1, 7, 16, 21, 41, 42,46, 52 ,53,63,86,97,3,53};
mergeSort(data, 0, data.length - 1); //
printData(data);
}
private static void mergeSort(int[] data, int low, int high) {
if(low>=high){
return ;
}
int mid = (low+high)/2;
mergeSort(data,low,mid);
mergeSort(data, mid+1, high);
merge(data,low,mid,high);
}
private static void merge(int data[],int low,int mid,int high){
int [] temp = new int[high-low+1];
int key = 0 ;
int i = low;
int j = mid+1;
/**把data从low到high可以看成从mid分开的两个数组
* 分别遍历两个数组,把最小值放入临时数组
* */
for(;i<=mid && j<=high;key++){
if(data[i]>data[j]){
temp[key] = data[j];
j++;
}else{
temp[key] = data[i];
i++;
}
}
/** 若从data[low] 到 data[mid]遍历完,则可能data[min+1]到data[high]的值还未遍历完
* 并且这些值肯定比data[mid]大,且是有序的.直接追加到temp后即可 */
if(i>mid){
while(j<=high){
temp[key]=data[j];
key++;
j++;
}
}
/**同理上 */
if(j>high){
while(i<=mid){
temp[key]=data[i];
key++;
i++;
}
}
/**把temp数组的值并归回data数组 */
setData(data,temp,low);
}
private static void setData(int []data,int []temp,int low){
if(data.length<temp.length){
return ;
}else{
for(int i = 0;i<temp.length;i++){
data[low+i] = temp[i];
}
}
}
public static void printData(int[] data) {
for (int i : data) {
System.out.print(i + " ");
}
System.out.println();
}
}
相关文章推荐
- java实现堆排序(放入数组的索引对应二叉树节点位置)、归并排序
- 归并排序的递归与非递归实现理解(Java)
- 归并排序 java实现
- 排序(快排,冒泡,堆排序,插入排序,归并排序,选择排序)算法Java实现
- 归并排序Java实现及错误总结
- Java实现快速排序、归并排序、堆排序
- 《七大排序算法》(六)之归并排序(Java实现)
- 归并排序--Java实现
- 数据结构与算法(10)---Java语言实现:归并排序
- 算法学习之路:分治策略-归并排序-java实现
- 归并排序java实现
- Shell、归并排序、递归的java实现
- 归并排序【Java实现】
- 归并排序java实现
- Java实现单链表的快速排序和归并排序
- Java实现归并排序
- 归并排序——java实现
- 程序员必知的8大排序(四)-------归并排序,基数排序(java实现)
- 归并排序 Java实现
- 算法导论:归并排序java实现