一、歸併排序
是採取分治的思想
1、先劃分步長(gap)
2、根據步長劃分數據(定長數據+剩餘數據)
3、小區域內排序
public int[] mergeSort(int[] A, int n) {
for (int gap = 1; gap < A.length; gap = 2 * gap)
MergePass(A, gap, n);
return A;
}
public void MergePass(int[] A, int gap, int length) {
int i = 0;
// 歸併gap長度的兩個相鄰子表
for (i = 0; i + 2 * gap < length; i += 2 * gap) {
Merge(A, i, i + gap - 1, i + 2 * gap - 1);
}
// 餘下兩個子表,後者長度小於gap
if (i + gap < length) {
Merge(A, i, i + gap - 1, length-1);
}
}
/**
排序,先開闢一片內存空間 ,然後根據大小排放
*/
public void Merge(int[] A, int low,int mid,int high){
int i=low;
int j=mid+1;
int k=0;
int[] A2=new int[high-low+1];
while(i<=mid && j<=high){
if(A[i]<=A[j]){
A2[k]=A[i];
k++;
i++;
}else{
A2[k]=A[j];
k++;
j++;
}
}
while(i<=mid){
A2[k]=A[i];
k++;
i++;
}
while(j<=high){
A2[k]=A[j];
k++;
j++;
}
for(k=0,i=low;i<=high;i++,k++){
A[i]=A2[k];
}
}