南大高级算法作业之非递归合并排序

import java.util.*;

public class Main

{	

	//一次划分排序

	public static void merge(int[]element,int left,int mid,int right){

		int[] temp = new int[right-left+1];
		
		int l = left;

		int r = right;

		int i = mid+1;
		
		int k = 0;

		//将两部分合并
		while(l <= mid && r >= i){

			if(element[l] < element[i]){

				temp[k] = element[l];

				l ++;

			}else{
				
				temp[k] = element[i];

				i ++;

			}

			k++;

		}

		//右半部分先比完
		if(l <= mid){

			while(l <= mid){

				temp[k] = element[l];

				l ++;

				k++;

			}

		}

		//左半部分先比完
		if(i <= r){

			while(i <= r){

				temp[k] = element[i];

				i ++;
				
				k ++;

			}

		}

		for(int j=0;j < temp.length;j ++){

			element[left+j] = temp[j];

		}

	}

	

	public static void main (String[] args){

		Scanner scan = new Scanner(System.in);

		while(scan.hasNext()){

		    int num = scan.nextInt();//元素数

    		    int[] element = new int[num];

    		//初始化数组
    		for(int i=0;i < num;i ++){	

    			element[i] = scan.nextInt();

    		}

    		int len = 1;

            while (num > len) {

                for(int i=0;i < num;i += 2*len){

                	int left = i;	

                	int mid = i+len-1;

                	int right = i+2*len-1;

                	//num为奇数时会越界
                	if(right > num-1){

                		right = num-1;

                	}
                	
                	if(mid > num-1){

                		mid = num-1;

                	}

                	merge(element,left,mid,right);
          	
                }

                len *=2;

            }

    		for(int i=0;i < num;i ++){
	
    			if(i == num-1){
		
    				System.out.print(element[i]);

    			}else{

    				System.out.print(element[i]+" ");

    			}

    		}
    		
    		System.out.println();

		}

	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值