1.先讲堆栈
1 、静态变量不入栈。
2 、栈由编译器自动分配和释放。栈中存放局部变量和参数,函数调用结束后,局部变量先出栈,然后是参数。
3 、数组比用指针速度要快一些,因为指针在底层汇编中需要用 edx 寄存器中转一下,而数组在栈上直接读取。
4 、堆是由程序员通过 new 、 malloc 、 free 、 delete 等指令进行分配和释放。如果程序员没有进行释放,程序结束时可能有 OS 回收。
5 、堆是由 new 分配的内存,速度较慢;栈是由系统自动分配,速度较快。
ArrayIndexOutOfBoundsException :角标越界
NullPointerException :空指针异常,当引用没有任何指向值,为Null 的情况,该引用还在操作实体。
5.选择排序
7.折半查找
1 、静态变量不入栈。
2 、栈由编译器自动分配和释放。栈中存放局部变量和参数,函数调用结束后,局部变量先出栈,然后是参数。
3 、数组比用指针速度要快一些,因为指针在底层汇编中需要用 edx 寄存器中转一下,而数组在栈上直接读取。
4 、堆是由程序员通过 new 、 malloc 、 free 、 delete 等指令进行分配和释放。如果程序员没有进行释放,程序结束时可能有 OS 回收。
5 、堆是由 new 分配的内存,速度较慢;栈是由系统自动分配,速度较快。
6、比如存放在栈里面的数组,是在运行时赋值。而存在堆里面的指针数据,是在编译时就确定的。
2.数组在堆栈中
3.获取最小值
public static int getMin(int [] arr)
{
int min=0;
for(int i=1;i< arr.length();i++)
{
if(arr[i]<arr[min])
min=i;
}
return arr[min];
}
4.关于2个异常
ArrayIndexOutOfBoundsException :角标越界
NullPointerException :空指针异常,当引用没有任何指向值,为Null 的情况,该引用还在操作实体。
5.选择排序
![](https://img-my.csdn.net/uploads/201304/14/1365942073_7498.jpg)
//选择排序
public static void selectSort(int[] arr)
{
for(int x=0;x<arr.length-1;x++)
{
for(int y=x+1;y<arr.length;y++)
{
if(arr[x]>arr[y])
{
int temp=arr[x];
arr[x]=arr[y];
arr[y]=temp;
}
}
}
}
6.冒泡排序:
//冒泡排序
public static void bubbleSort(int[] arr)
{
for(int x=0;x<arr.length-1;x++)
{
for(int y=0;y<arr.length-1-x;y++) //-x让每一次比较的元素减少,-1 避免角标越界
{
if(arr[y]>arr[y+1])
{
int temp=arr[y];
arr[y]=arr[y+1];
arr[y+1]=temp;
}
}
}
}
7.折半查找
![](https://img-my.csdn.net/uploads/201304/14/1365942105_6746.jpg)
//折半查找,提高效率,但必须保证该数组是有序的数组
public static int halfSearch(int []arr,int key)
{
int min,max,mid ;
min=0;
max=arr.length-1;
mid=(min+max)/2;
while(arr[mid]!=key)
{
if(key>arr[mid])
min=mid+1;
else if(key<arr[mid])
min=max-1;
if(min>max)
return -1;
mid=(max+min)/2;
}
return mid;
}
//折半的第二种方式
public static int halfSearch_2(int []arr,int key)
{
int min,max,mid ;
min=0;
max=arr.length-1;
mid=(min+max)/2;
while(min<=max)
{
mid=(max+min)>>1;
if(key>arr[mid])
min=mid+1;
else if(key<arr[mid])
min=max-1;
else
return -1;
}
return mid;
}