数组

数组是一种线性数据结构,是再内存中是顺序存储的(即数组中每个元素存储地址相邻),我们可以根据第一个元素的地址通过和数组中其他元素的地址偏移(相对位置)的加法运算确定具体的存储地址,从而达到快速存取的目的。

java中如何定义数组

Java中有三种定义方式:

方法一
先声明,然后分配空间,最后再赋值

public class arr{
    public static void main(String[] args){
        int[] arr;    //先声明
        arr=new int[5];  //分配空间
        for(int i=0;i<5;i++)arr[i]=i*10;  //赋值
    }
}

方法二
声明并分配空间,然后赋值

public class arr{
    public static void main(String[] args){
        int[] arr=new int[5];    //声明并分配空间
        for(int i=0;i<5;i++)arr[i]=i*10;    //赋值
    }
}

方法三
声明并分配空间同时赋值

public class arr{
    public static void main(String[] args){
        int[] arr={20,68,34,22,34}; //声明并分配空间同时赋值    等同于 int[] arr= new []{20,68,34,22,34};
    }
}

注:二维数组同理,可以看成是一维数组中的每个元素又是一维数组。

排序

将数据按照特定的顺序排列,目的就是为了方便查找!!!
目前:优秀的排序有很多
现在先介绍冒泡排序 ,插入排序, 选择排序

冒泡排序

比较相邻的元素,如果前一个比后一个大,交换之。
第一趟排序第1个和第2个一对,比较与交换,随后第2个和第3个一对比较交换,这样直到倒数第2个和最后1个,将最大的数移动到最后一位。
第二趟将第二大的数移动至倒数第二位

因此需要n-1趟;

public class BubbleSortMain {

    public static void main(String[] args) {
    }
    private static void bubbleSort(int[] arr) {
        if(arr==null || arr.length < 2 ){
            return;
        }
        for (int i = 0; i < arr.length - 1; i++) {//n-1趟
            for (int j = 0; j < arr.length - i -1; j++) { 
                if (arr[j] > arr[j + 1]) {//比较相邻的元素,如果前一个比后一个大,交换之
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }
}

插入排序
插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。

Insertion sort
public class InsertionSort{

    public static void main(String[] args) {
    }
    private static void insertionSort(int[] arr) {
       int temp;
        for (int i=1;i<arr.length;i++){
            //待排元素小于有序序列的最后一个元素时,向前插入
            if (arr[i]<arr[i-1]){
                temp = arr[i];
                for (int j=i;j>=0;j--){
                    if (j>0 && arr[j-1]>temp) {
                        arr[j]=arr[j-1];
                    }else {
                        arr[j]=temp;
                        break;
                    }
                }
            }
        }
    }
}

选择排序
选择排序是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。

public class SelectionSort {
    public int[] selectionSort (int[] sourceArray)  {
        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
        // 总共要经过 N-1 轮比较
        for (int i = 0; i < arr.length - 1; i++) {
            int min = i;
            // 每轮需要比较的次数 N-i
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[min]) {
                    // 记录目前能找到的最小值元素的下标
                    min = j;
                }
            }
            // 将找到的最小值和i位置所在的值进行交换
            if (i != min) {
                int tmp = arr[i];
                arr[i] = arr[min];
                arr[min] = tmp;
            }
        }
        return arr;
    }
}

查找

目前所有的查找算法,都是依赖于有序数组,在这只介绍折半查找(二分查找)。
折半查找(二分查找)
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

public class Test {
	public static void main(String[] args) {
		int[] arr = new int[] {-100,1,10,12,24,32,55,60,88};
		System.out.println(binarySearch(arr,88));
	}
	public static int binarySearch(int[] arr, int key) {
		int start = 0;
		int end = arr.length - 1;
		while (start <= end) {
			int middle = (start + end) / 2;
			if (key > arr[middle]) {
				start = middle+1;
			} else if(key < arr[middle]) {
				end = middle-1;
			} else {
				return middle;
			}
		}
		return -1;
	}
}