插入排序和归并排序

我是根据算法导论中比喻来理解插入排序和归并排序

首先是插入排序,这个过程就可以比喻成左手放牌(已排好序),右手抓牌(牌堆上最顶端的一张牌),然后放到左手,插到正确的位置

伪代码

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;

可用代码

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;
    }
}

归并排序的思想就是,先想象成将一个数组中的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个数的排序分治成每一个数字,即两个数比较大小之后合并成一组,一组两个数和另外一组的两个数合并到一组中,一次类推。

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[n];
        }

    }

    //使用到递归的思想,最小会细分到一个数为一组
    //然后二个数比较大小后合并成一组一组就有两个数依次类推
    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));
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值