数组
Java中包括基本类型和对象类型,其中数组属于对象类型。(虽然在C++中数组也是基本类型)
int[] a;
a=new int[100];
//int[] a=new int[100]
数组存储在其他的地址中,a中指保存内个地址。
数组一旦创建,大小不会改变。初始化为空null,当我们尝试访问含有null数组数据项时,会得到空指针报错。
数组可以按照无须数组和有序数组来进行分别学习。
算法 | 时间复杂度 |
---|---|
线性查找 | O(N)(还可以) |
二分查找 | O(logN)(良好) |
无序数组的插入 | O(1)(优秀) |
有序(无序)数组的删除 | O(N) |
有序数组的删除 | O(N) |
简单排序
- 冒泡排序
public void bubleSort(){
int out,in;
for(out=n-1;out>1;out--){
for(in=0;in<out;in++){
if(a[in]>a[in+1])
swap(in,in+1);
}
}
}//end
private void swap(int m,int n){
long temp=a[m];
a[m]=a[n];
a[n]=temp;
}
思路:数组由小到大进行排序,每次将两个相邻的数据进行比较,将大的那个放在右边,整一套下来,保证了最大的在最右边。也就是说内部的in的循环结束后,下标大于out的数据项已经排好。
时间复杂度:O(N^2),可以说是相当慢了
- 选择排序
public void selectionSort(){
int out,in,min;
for(out=0;out<n-1;out++){
min=out;
for(in=out+1;in<n;in++){
if(a[in]<a[min]) min=in;
swap(out,min);//swap()函数同上,实际交换的是引用的位置
}
}
}//end
不同于冒泡排序中数组下标大于out的总是有序的,在选择排序中,数组下标小于in的总是有序的。
选择排序中,进行的比较次数和冒泡排序中的一样多,但是交换次数只有O(N),但是我们认为N值很大时,时间复杂度依然是O(N^2)。但是选择排序会比冒泡排序要快很多啦。
- 插入排序
public void insertionSort(){
int in,out;
for(out=1;out<n;out++){
long temp=a[out];
in=out;
while(in>0&&a[in-1]>temp){
a[in]=a[in-1];
--in;
}
a[in]=temp;
}
}
每一趟之后,比out下标小的总是有序的。out标记了未排序部分的最左端数据,in从out变量向左移动,直到temp值小于in所指的数组数据项。
适用于基本有序的数组。
tips:
复制是交换的三倍
在插入排序中,一个数据项被插入到局部有序的组合后,他将永远不会向左边移动。
稳定性是指在对州进行排序时,每个周的城市还要求按照人口递增排序。