java学习---数组与排序

复制数组:把一个数组的值,复制到另一个数组中
System.arraycopy(src,srcPos,dest,destPos,length)
src:原数组
srcPos:从原数组复制数据的起始位置
dest:目标数组
destPos:复制到目标数组的起始位置
length:复制的长度

实例:

public static void main(String[] args) {
		int[] a = new int[]{18,62,68,82,65,9};
		int[] b=new int[3];
		System.arraycopy(a, 0, b, 0, 3);
		for (int i = 0; i < b.length; i++) {
            System.out.print(b[i] + " ");
        }
	}
结果:
18 62 68

与使用System.arraycopy进行数组复制类似的, Arrays提供了一个copyOfRange方法进行数组复制。
不同的是System.arraycopy,需要事先准备好目标数组,并分配长度。 copyOfRange 只需要源数组就就可以了,通过返回值,就能够得到目标数组了。

实例:

public static void main(String[] args) {
		int[] a = new int[]{18,62,68,82,65,9};
		int[] b= Arrays.copyOfRange(a, 0, 3);
		for (int i = 0; i < b.length; i++) {
            System.out.print(b[i] + " ");
        }
结果为:
18 62 68 
转换为字符串:
如果要打印一个数组的内容,就需要通过for循环来挨个遍历,逐一打印
但是Arrays提供了一个toString()方法,直接把一个数组,转换为字符串,这样方便观察数组的内容
public static void main(String[] args) {
		int[] a = new int[]{18,62,68,82,65,9};
		String content = Arrays.toString(a);
		System.out.println(content);
	}
结果为:
[18, 62, 68, 82, 65, 9]
选择法排序:
选择法排序的思路: 
把第一位和其他所有的进行比较,只要比第一位小的,就换到第一个位置来 
比较完后,第一位就是最小的 
然后再从第二位和剩余的其他所有进行比较,只要比第二位小,就换到第二个位置来 
比较完后,第二位就是第二小的 
以此类推
public static void main(String[] args) {
		int[] a = new int[]{18,62,68,82,65,9};
		//选择法排序
		//第一步:把第一位和其他所有位进行比较
		//如果发现其他位置的数据比第一位小,就进行比较
		for (int j = 0; j < a.length-1; j++) {
			for (int i = j+1; i < a.length; i++) {
				if(a[i]<a[j]){
					int temp = a[j];
					a[j]=a[i];
					a[i]=temp;
				}
			}
		}
		//打印内容
		for(int i=0;i<a.length;i++){
			System.out.println(a[i]+" ");
		}
		System.out.println(" ");
	}
结果为:
9 
18 
62 
65 
68 
82 
冒泡法排序:
冒泡法排序的思路: 
第一步:从第一位开始,把相邻两位进行比较 
如果发现前面的比后面的大,就把大的数据交换在后面,循环比较完毕后,最后一位就是最大的 
第二步: 再来一次,只不过不用比较最后一位 
以此类推
public static void main(String[] args) {
		int[] a = new int[]{18,62,68,82,65,9};
		//选择法排序
		//第一步:把第一位和其他所有位进行比较
		//如果发现其他位置的数据比第一位小,就进行比较
		for (int j = 0; j < a.length; j++) {
			for (int i = 0; i < a.length-j-1; i++) {
				if(a[i] > a[i+1]){
					int temp = a[i];
					a[i]=a[i+1];
					a[i+1]=temp;
				}
			}
		}
		//打印内容
		for(int i=0;i<a.length;i++){
			System.out.println(a[i]+" ");
		}
		System.out.println(" ");
	}
结果为:
9 
18 
62 
65 
68 
82 
排序方法:sort()

Arrays.sort()使用的是经过调优的快速排序法
Arrays.sort()主要原理:

针对基本数据类型,Array.sort()采用DualPivotQuickSort算法排序;
	DualPivotQuickSort基本流程:
	元素个数:不超过插入排序阈值(默认47),选用插入排序;
	元素个数:插入排序阈值-快排阈值(默认286),选用DualPivotQuickSort
	元素个数:超过快排阈值,选用TimSort归并排序;
	DualPivotQuickSort性能
	DualPivotQuickSort在经典快排基础上改进,时间复杂度稳定为O(n logn)
针对Object类型和泛型:TimSort
	TimSort基本流程
	用户通过系统参数LegacyMergeSort.userRequested选定排序方式:
	LegacyMergeSort.userRequested为TRUE,进行经典二路归并;
	LegacyMergeSort.userRequested为FALSE,进行TimSort归并排序;
	TimSort性能
	TimSort算法平均时间复杂度为O(n logn),最优情况下为O(n)好于经典归并排序O(n logn),空间复杂度与经典归并排序一样均为O(n);
	因此在JDK1.8中,Java对对象和泛型使用TimSort的原因是:
	TimSort性能稳定,而快速排序不稳定;
	TimSort最优情况下时间复杂度为O(n)好于经典归并排序O(n logn)

实例:

public static void main(String[] args) {
		int[] a = new int[]{18,62,68,82,65,9};
		System.out.println("排序前:");
		System.out.println(Arrays.toString(a));
		Arrays.sort(a);
		System.out.println("排序之后:");
		System.out.println(Arrays.toString(a));
		
	}
结果为:
排序前:
[18, 62, 68, 82, 65, 9]
排序之后:
[9, 18, 62, 65, 68, 82]
搜索:
查询元素出现的位置
需要注意的是,使用binarySearch进行查找之前,必须使用sort进行排序
如果数组中有多个相同的元素,查找结果是不确定的

实例:

public static void main(String[] args) {
		int[] a = new int[]{18,62,68,82,65,9};
		Arrays.sort(a);
		System.out.println("排序之后:"+Arrays.toString(a));
		System.out.println("数字62出现的位置:"+Arrays.binarySearch(a, 62));
	}
结果为:
排序之后:[9, 18, 62, 65, 68, 82]
数字62出现的位置:2
填充:使用同一个值,填充整个数组
public static void main(String[] args) {
		int[] a = new int[10];
		Arrays.fill(a, 5);
		System.out.println("排序之后:"+Arrays.toString(a));
	}
结果为:
[5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值