归并排序 java 迭代_经典排序算法之归并排序(示例代码)
歸并排序(英語:Merge sort,或mergesort),是創建在歸并操作上的一種有效的排序算法,效率為
(大O符號)。1945年由約翰·馮·諾伊曼首次提出。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用,且各層分治遞歸可以同時進行。歸并排序適用于數據量大,同時解決了快速排序的痛點,大量重復數據并且鏈式結構同樣適用(鏈式結構需要自己修改上述代碼),但是歸并排序同樣也有問題就是需要開辟額外空間。
歸并操作(merge),也叫歸并算法,指的是將兩個已經排序的序列合并成一個序列的操作。歸并排序算法依賴歸并操作。
遞歸法(Top-down)
申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合并后的序列
設定兩個指針,最初位置分別為兩個已經排序序列的起始位置
比較兩個指針所指向的元素,選擇相對小的元素放入到合并空間,并移動指針到下一位置
重復步驟3直到某一指針到達序列尾
將另一序列剩下的所有元素直接復制到合并序列尾
迭代法(Bottom-up)
原理如下(假設序列共有
個元素):
將序列每相鄰兩個數字進行歸并操作,形成
個序列,排序后每個序列包含兩/一個元素
若此時序列數不是1個則將上述序列再次歸并,形成
個序列,每個序列包含四/三個元素
重復步驟2,直到所有元素排序完畢,即序列數為1
// 歸并排序 遞歸法,
// 注意返回的才是排好序的數組,原數組沒有變動
function _merge(left, right){
// 創建大小為left + right 大小的數組
let result = [];
while(left.length > 0 && right.length > 0){
if (left[0] < right[0]){
result.push(left.shift());
} else{
result.push(right.shift());
}
}
return result.concat(left, right);
}
function mergeSort(arr){
if (arr.length <= 1) return arr;
let mid = arr.length >> 1;
let left = arr.slice(0, mid);
let right = arr.slice(mid);
return _merge(mergeSort(left), mergeSort(right));
}
c語言實現
?```c
// 歸并排序, 遞歸法
void sortMergeRecursive(int *arr, int * reg, int start, int end){
if (start >= end) return;
int len = end - start;
int mid = (len >> 1) + start;
int startLfet = start, endLeft = mid;
int startRight = mid + 1, endRight = end;
sortMergeRecursive(arr, reg, startLfet, endLeft);
sortMergeRecursive(arr, reg, startRight, endRight);
int k = start;
// 左右兩個數組按照大小合并成一個
while (startLfet <= endLeft && startRight <= endRight){
reg[k++] = arr[startLfet] < arr[startRight] ? arr[startLfet++] : arr[startRight++];
}
// 把另一個數組剩余的元素全部拷貝到reg數組里
while (startLfet <= endLeft){
reg[k++] = arr[startLfet++];
}
while (startRight <= endRight){
reg[k++] = arr[startRight++];
}
// 更新arr
for (k = start; k <= end; k++){
arr[k] = reg[k];
}
}
// 歸并排序 入口
void sortMerge(int *arr, const int len){
int reg[len];
sortMergeRecursive(arr, reg, 0, len-1);
}
?```!--more-->
總結
以上是生活随笔為你收集整理的归并排序 java 迭代_经典排序算法之归并排序(示例代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: su如何快速渲染模型
- 下一篇: ricky java photos_【M