八大排序演算法 歸併排序(七)

2021-10-21 01:21:40 字數 2029 閱讀 1530

//歸併排序

public

class

mergesort

int mid =

(right - left)/2

+ left;

mergesort

(data, left, mid)

;mergesort

(data, mid +

1, right)

;int i = left;

int j = mid +1;

int temp =0;

while

(i < j && j <= right)

else}if

(i == j)

temp = j;

while

(j <= right)

else

}// 比如data = [1,4,5,10,2,4,7,8],此時i=1,temp=4,j=5

// 先變成[1,10,5,4,2,4,7,8]

reverse

(data, i, temp -1)

;// 再變成[1,10,5,4,2,4,7,8]

reverse

(data, temp, j -1)

;// 最後[1,2,4,5,10,4,7,8]

reverse

(data, i, j -1)

;// j-temp是上一步參加翻轉的第二組資料個數,i跳過它們,繼續往下。

i += j - temp;}}

private

void

swap

(int

data,

int left,

int right)

// 翻轉陣列

private

void

reverse

(int

data,

int left,

int right)

while

(left < right)

}// 借助輔助陣列實現

public

void

mergesort2

(int

data,

int left,

int right)

// 先定義乙個輔助陣列,防止在遞迴中新建大量陣列

int[

] temp =

newint

[data.length]

;mergesort2

(data, left, right, temp);}

private

void

mergesort2

(int

data,

int left,

int right,

int[

] temp)

int mid =

(right - left)/2

+ left;

mergesort2

(data, left, mid, temp)

;mergesort2

(data, mid +

1, right, temp)

;int count = left;

int i = left;

int j = mid +1;

while

(i < mid +

1&& j <= right)

else

}while

(j <= right)

else}}

// count小於等於right,說明有沒填完的

if(count <= right)

}else}}

// 把temp中排好的寫入data中。

for(

int k = left; k <= right; k++)}

}

八大排序演算法(七)歸併排序

基本思想 歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併排序示例 合併方法 設r i n 由兩個有序子表r i m 和r m 1 n 組成,兩個子表長度分別為n i 1 n m。...

八大排序演算法 歸併排序

歸併排序的定義 是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併排序的基本思想 設r i n 由兩個有序子表r i m 和r m 1 n 組成,兩個子表長度分別為n i 1 n m。1 j m 1 k i...

八大排序 歸併排序

歸併排序 1.申請空間,使其大小為兩個已經排序的序列之和,用來存放合併後的序列。2.設定兩個指標指向兩序列的開始。3.比較兩個指標所指的元素,選擇小的放的合併空間,移動指標。4.重複3直到某個指標到達序列尾。5.將剩餘的元素拷到合併空間。實現 void merge sort int arr,int ...