內部排序 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;
}
插入排序
屬於內部排序法,是對於欲排序的元素以插入的方式找尋該元素的適當位置,以打倒排序的目的。
插入排序又分爲插入排序法、謝爾排序法、二叉樹排序法
查找
分爲順序查找和二分查找