归并排序:
主函数:
void merge(int arr[], int l, int mid, int r){
int* cpy = new int[r - l + 1]; // 创建一个辅助数组
for (int i = l; i <= r; i ++)
cpy[i - l] = arr[i];
int i = l, j = mid + 1;
for (int k = l; k < r - l + 1; k ++){
if (i > mid){
arr[k] = cpy[j-l];
j ++;
}
else if (j > r){
arr[k] = cpy[i-l];
i ++;
}
else if (cpy[i-l] < cpy[j-l]){
arr[k] = cpy[i-l];
i ++;
}
else{
arr[k] = cpy[j-l];
j ++;
}
}
delete[] cpy;
}
void mergeSort(int arr[], int l, int r){
if (l >= r){
return;
}
int mid = (l+r) / 2;
mergeSort(arr, l, mid);
mergeSort(arr, mid + 1, r);
merge(arr, l, mid, r);
}
void MergeSort(int arr[], int n){
mergeSort(arr, 0, n - 1);
}
测试函数:
int main() {
int arr[] = {2,3,6,8,0,7};
MergeSort(arr, 6);
for (int i = 0; i < 6; i ++){
cout << arr[i] << " ";
}
cout << endl;
std::cout << "Hello, World!" << std::endl;
return 0;
}
附一张图说明merge过程:
不停的去比较i和j位置的元素大小,并将比对结果放入arr中,注意原数组的索引位置可能不是从零开始的
k:在原数组中的位置
i:复制数组的第一个元素
mid:复制数组的中间元素