java数组的总结

数组总结

 

数组的声明:

类型 [] 数组名 或 类型 数组名[] 

声明数组时不能指定其长度

数组的创建:

Java中使用关键字new创建数组对象,格式为:
数组名 = new 数组元素的类型 [数组元素的个数]

数组的结构:

在内存中的空间是线性的。其传递为引用传递,即传首地址。一旦创建数组,数组大小便不可改变。length属性表示其大小。

 

【数组排序】

稳定算法:冒泡排序、插入排序、归并排序和基数排序

不稳定算法:选择排序、快速排序、希尔排序、堆排序

 

稳定性的概念(摘自百度百科):

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。

即判断排序后原来相同元素的先后顺序是否发生改变,若是,则不稳定。

 

冒泡排序:

    比较相邻两个元素的大小,将较小的元素向前调整。若相邻元素相同,则不需要调整,故先后顺序不会改变。故为稳定算法。

例:

4# 6

4# 6

4# 6

46

46

46

 

选择排序:

    依次给每个位置选择最小元素,交换对应位置的元素。

例: 

5   5#  2  1  

1   5#  2  5  

1   2   5# 5  

可看出5和5#的位置发生了变化。故是不稳定算法。

 

插入排序
    是在一个已经有序的小序列的基础上,一次插入一个元素。只有第一个元素,就是第一个元素。想要插入的元素和已经有序的最大者开始比

例:(|之前为有序,|后一个为要插入的元素

2|  4  9    5# 

 5| 4  9  8   5#

  5| 9  8  1  5#

   9| 8   5#

    9| 1  5#

     9| 5#

 2  4  5  5# 8  9|

对于两个相同元素,后一个元素在插入时,从有序序列末位开始往前比较,当遇到相同元素后停止,并不交换顺序(仍在后面)。故为稳定的。 

 

希尔排序

    将整个序列分成若干子序列,分别进行插入排序实际上是分组插入。虽然插入排序是稳定的,但在不同组别的排序过程中,相同的元素可能发生交叉,稳定性就会被打乱,所以希尔排序是不稳定的。 

例:

 49  38  65  97  76  13  27  49# 55  04  (初始)

 13  27  49# 55  04  49  38  65  97  76  (步长为5)

 13  04  49# 38  27  49  55  65  97  76  (步长为3)

 04  13  27  38  49# 49  55  65  97  76  (步长为1)

可看出两个49的相对顺序变了。 

 

 

附:上述四种排序算法的源代码

/**
	 * 对给定一维数组做冒泡排序
	 * @param arrayOne 需要排序的数组
	 * @return 经过排序的数组
	 */
	public int[]  paixu_maopao(int [] arrayOne) {
		
		for (int i = 0; i < arrayOne.length; i++) {
			for (int j = i+1; j <arrayOne.length; j++) {
				if(arrayOne[i]>arrayOne[j]){
					int temp=arrayOne[j];
					arrayOne[j]=arrayOne[i];
					arrayOne[i]=temp;
					
				}printArrayOne(arrayOne);
			}
			
		}
		
		return arrayOne;
	}
	
	/** 
	 *  对给定一维数组做选择排序
	 * @param arrayOne 需要排序的数组
	 * @return 经过排序的数组
	 */
	
	public int[] paixu_xuanze(int [] arrayOne) {
		for (int i = 0; i < arrayOne.length; i++) {
			int low=i;
			for (int j = i+1; j < arrayOne.length; j++) {
				if(arrayOne[j]<arrayOne[low]){
				low=j;
				}//printArrayOne(arrayOne);
			}
			int temp=arrayOne[i];
			arrayOne[i]=arrayOne[low];
			arrayOne[low]=temp;
		}
		
		return arrayOne;
	}
	
	
	/** 
	 *  对给定一维数组做插入排序
	 * @param arrayOne 需要排序的数组
	 * @return 经过排序的数组
	 */
	private int[] paixu_charu(int [] arr) {
		for (int i = 1; i < arr.length; i++) {
			for (int j = i; j > 0; j--) {
				if(arr[j-1]>arr[j]){
					int temp=arr[j];
					arr[j]=arr[j-1];
					arr[j-1]=temp;
				}
			}
		}
		return arr; 
	}
	/** 
	 *  对给定一维数组做希尔排序
	 * @param arrayOne 需要排序的数组
	 * @return 经过排序的数组
	 */
	private int []  paixu_xier(int [] arr) {
		for(int inc=arr.length/2; inc>0;inc/=2){
			for (int i = inc; i < arr.length; i++) {
				int temp = arr[i];
				int j=0;
				for (j = i ;j >= inc; j-=inc) {
					if(temp < arr[j-inc]){
						arr[j]=arr[j-inc];
						
					}else{
						break;
					}
				}
				arr[j]=temp;
			}
			
			
		}
		return arr;
	}

 

<!--EndFragment-->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值