歸併排序(Java)
阿新 • • 發佈:2019-01-31
文章參考了博文“白話經典演算法”(http://blog.csdn.net/morewindows/article/details/6678165/)。
歸併是把兩個已排序檔案合併成一個更大的已排序檔案的過程,而相比之下,選擇是把一個檔案分成包含k個最小元素和n-k個最大元素兩部分的過程。歸併排序適用於連結串列排序。
演算法的主體部分如下,通過遞迴,將原序列分化成子序列:
void MergeSort(int A[], int temp[], int left, int right){ int mid; if(right>left){ mid = (right+left)/2; MergeSort(A,temp,left,mid); MergeSort(A,temp,mid+1,right); Merge(A,temp,left,mid+1,right); } }
演算法的合併部分如下,注意的是left-mid-1和mid-right都是已經排好序的:
測試程式碼如下:void Merge(int[] A, int[] temp, int left, int mid, int right) { // TODO Auto-generated method stub int i, left_end, size, temp_pos; left_end = mid-1; temp_pos = left; size = right-left+1; while( (left<=left_end) && (mid<=right) ){ if(A[left] <= A[mid]){ temp[temp_pos] = A[left]; temp_pos = temp_pos+1; left = left+1; } else{ temp[temp_pos] = A[mid]; temp_pos = temp_pos + 1; mid = mid + 1; }//else } while(left <= left_end){ temp[temp_pos] = A[left]; left = left + 1; temp_pos = temp_pos + 1; } while(mid <= right){ temp[temp_pos] = A[mid]; mid = mid + 1; temp_pos = temp_pos + 1; } for(i=0;i<size;i++){ A[right] = temp[right]; right = right-1; } }
public static void main(String[] args) {
int[]A = {12,23,34,2,34,66,15};
int[] temp = new int[A.length];
MergeSort(A,temp,0,A.length-1);
for(int i=0;i<A.length;i++)
System.out.println(A[i]);
}