归并排序和基数排序

归并排序

归并排序思想

归并排序的思想:针对已排序好的两个或两个以上的文件,经由合并的方式,并将其组合为一个大的且已经排好序的文件。

时间复杂度: O(nlogn)
空间复杂度:O(n)

是一种稳定的排序方式

实现过程:

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

归并排序代码

代码:

package javapaixu;

import java.util.Arrays;
/**
 * 归并排序
 * 时间复杂度:O(nlogn)
 * 稳定性:不稳定
 * 空间复杂度:O(n)
 */
public class Guibing {
    public static void mergeSort(int[] array) {
        if(array == null || array.length == 0) {
            return;
        }
        for(int i = 1;i < array.length;i = i*2) {
        	 merge(array,i);
        }
    }
	public static void merge(int[] array, int gap) {//gap每个归并段的数据个数
		int start1 = 0;
		int end1 = start1+gap-1;
		int start2 = end1+1;
		int end2 = start2+gap-1<array.length-1?  start2+gap-1:array.length-1;
		//排序
		int[] tmparray = new int[array.length];
		int i = 0;//tmparray的下标
		while(start2 < array.length) {
			//比较元素   s1   s2   s1++  s2++
			//两个归并段是否都有数据
			while(start1 <= end1 && start2 <= end2) {
				if(array[start1] < array[start2]) {
					tmparray[i++] = array[start1++];
				}else {
					tmparray[i++] = array[start2++];
				}
			}
			while(start1 <= end1) {
				tmparray[i++] = array[start1++];
			}
			while(start2 <= end2) {
				tmparray[i++] = array[start2++];
			}
			//赶往下一个递归段
			start1 = end2+1;
			end1 = start1+gap-1;
			start2 = end1+1;
			end2 = start2+gap-1<array.length-1? start2+gap-1:array.length-1;
		}
       //剩下的s1 e1之间的内容需要放进tmparray
		while(start1 < array.length) {
			tmparray[i++] = array[start1++];
		}
		/*for(int j = 0;j < tmparray.length;j++) {
			array[j] = tmparray[j];
		}*/
		System.arraycopy(tmparray, 0, array, 0, tmparray.length);
	}
	public static void main(String[] args) {
		int[] array = {68,5,9,58,64,21,19};
		mergeSort(array);
		System.out.println(Arrays.toString(array));

	}

}

运行结果:

[5, 9, 19, 21, 58, 64, 68]

基数排序

基数排序不需要元素之间的比较,属于一种分配模式的排序方法,对于给定的一组数据,先准备从0~9十个箱子,先比较个位数,个位是0的放入0号箱子,个位是1的放入1号箱子,个位是2的放入2号箱子……,然后从0号到9号一次取出,在比较十位数,十位是0的放入0号箱子,十位是1的放入1号箱子,十位是2的放入2号箱子……
然后从0号到9号一次取出,再比较百位数,千位数……然后依次取出来就排好了

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这组数据最大只有三位数,到百位就完了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值