内部排序 vs 外部排序
- 内部排序:将需要处理的所有数据都加载到内存中进行排序。包括(交换式排序、选择式排序和插入式排序)
- 外部排序:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序,包括(合并排序法和直接合并排序法)。
- 排序是数据处理中很重要的运算,一般数据处理工作25%的时间都在进行排序。
交换式排序
属于内部排序法,是运用数据值比较后,根据判断规则对数据位置进行交换,以达到排序的目的。分两种:冒泡排序(Bubble sort)和快速排序(Quick sort)
仔细看看这个算法哪里出错了:
for(int i = 1;i <= a.length;++i){
for(int j = 0;j < a.length-i-1;++j){
// 每次都找出最大的放在未排序的后面
if(a[j] > a[a.length-i]){
int temp = a[j];
a[j] = a[a.length-i];
a[a.length-i]=temp;
}
}
}
这个算法意图是每次找到最大的值放到未排序的末尾
但是,首先分析一下,外层循环是控制循环次数,也就是length次。
但是内层,循环多少次?
当i =1,内层循环从0 到 a.length -2 ,也就是a.length -1 次。
当i = a.length-2 时,内层循环1次。
当i = a.length-1 时,内层循环0次。
当i = a.length时,内层循环0次。
所以这个排序算法虽然能正确的排序,但是,循环有冗余
冒泡排序
for(int i = 0;i < a.length;++i){
for(int j = 0;j < a.length-i-1;++j){
//每次比较相邻的两个数,大的放在后面,也就是冒泡
if(a[j] > a[j+1]){
int temp = a[j];
a[j] = a[j+1];
a[j+1]=temp;
}
}
}
选择排序
for(int i=0; i<v.length; i++){
int min = v[i];
int temp;
int index = i;
for(int j=i+1;j<v.length;j++){
if(v[j] < min){
min = v[j];
index = j;
}
}
temp = v[i];
v[i] = min;
v[index]= temp;
}
插入排序
属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以打倒排序的目的。
插入排序又分为插入排序法、谢尔排序法、二叉树排序法
查找
分为顺序查找和二分查找