数组
一系列相同类型的元素
有序的
连续的内存空间
初始化时固定大小
数组声明的三种方法
int[] a = new int[][10];
//申请10个int的内存空间,并初始化所有的元素为0
int[] a = {1,2,3};
//只能在声明时使用
int[] a = new int[]{1,2,3};
//可以在非声明时使用
System.currentTimeMills();//获得系统当前时间
交换两个变量的值
//交换两个变量的值 用异或做位运算效率高
public static void Change(int[] a, int i, int j) {
if (i == j) {
//内存地址相同不能交换
return;
}
a[i] = a[i] ^ a[j];
a[j] = a[i] ^ a[j];
a[i] = a[i] ^ a[j];
}
选择排序
//选择排序,将第一个数字记录,然后依次与后边的数字比较,比第一个小就换位置。
public static void sort(int[] a){
for (int i = 0; i < a.length - 1; i++) {
int min = i;
for (int j = i + 1; j < a.length -1; j++) {
if (a[min] > a[j]) {
min = j;
}
}
if (min != i) {
Change(a, i, min);
}
}
}
插入排序
//插入排序,从第二个数字开始,先按顺序排列前面的数字,后边数字依次插入往前比较。
public static void sort2(int[] a){
for (int i = 1; i < a.length - 1; i++) {
for (int j = i; j > 0; j--) {
if (a[j] < a[j - 1]) {
Change(a, j, j - 1);
}else {
break;//前面已经排好序,如果有比自己小的前面就不需要比较了
}
}
}
}
冒泡排序
//冒泡排序
public static void sort3(int[] a){
for (int i = a.length-1; i > 0; i--) {
for (int j = 0; j < i - 1; j++) {
if (a[j] < a[j + 1]) {
Change(a, j, j + 1);
}
}
}
}
快速排序
//快速排序,qsort只传入数组在跳到第二个方法,qsort2需要开始和结束的位置
数组中随机选择一个数,比这个数小的放在左边,比这个数大的放在右边。然后左边,右边分别看做数组再次进行上边的过程。
:快速排序需要先得到数组的中间随机一位数字,然后将这个数字和最后一位作交换,
前面的数字依次和最后一位进行比较大小,这是需要index来记位,index初始为数组第一个数的位置,有比最后一位数字小的往左移动,index++ 循环结束时index所指位置跟end位置初始选中的数字进行交换。这是左边是小的,右边是大的。左边看做一个数组,右边看做一个数组。利用递归再次进入循环,递归结束的条件为start == end;
public static void qsort(int[] a){
qsort2(a, 0, a.length - 1);
}
public static void qsort2(int[] a, int start, int end) {
if(start >= end){
return;
}
int index = random.nextInt(1) +end;
System.out.println("index="+index);
Change(a, index, end);
index = start;
for (int i = start; i < end ; i++) {
if (a[i] < a[end]) {
Change(a,i,index);
index++;
System.out.println("index2="+ index);
}
}
// if (a[index] >a[end]) {
Change(a,index,end);
// }
System.out.println(Arrays.toString(a));//输出数组每次排列后的数列情况
qsort2(a, 0, index - 1);
qsort2(a, index + 1, end);
}