归并排序
归并排序,是分治法的一个重要例子。分治法可以分为三个步骤:
#include<iostream>
using namespace std; void merge(int *arr, int left, int mid, int right) { int i, j,k; int numL = mid - left + 1; int numR = right - mid; int *arrL = new int[numL+1]; int *arrR = new int[numR+1]; for (i = 0; i < numL; i++) //将数组左边的数复制到arrL中 { arrL[i] = arr[left+i]; //cout << arrL[i]; } arrL[i] = 1000000000; //放置一个极大的数,用来作哨兵牌 for (j = 0; j < numR; j++) //将数组右边的数复制到arrR中 { arrR[j] = arr[mid +1+ j]; //cout << arrR[j]; } arrR[j] = 1000000000; i = j = 0; for ( k = left;k<=right;k++) //将数组arr从小到大排序 { if (arrL[i] <= arrR[j]) //如果arrL[i]小于等于arrR[j] { arr[k] = arrL[i]; i++; } else { arr[k] = arrR[j]; j++; } } } void mergeSort(int *arr, int left, int right) { int mid; if (left < right) { mid = (left + right) / 2; //获取中间数 mergeSort(arr, left, mid); //分解数组左边 mergeSort(arr,mid+1,right); //分解数组右边 merge(arr, left, mid, right); //合并 } } int main() { int arr[8] = {2,4,5,7,1,2,3,6}; mergeSort(arr, 0, 7); //merge(arr,0,3,7); for (int i = 0; i < 8; i++) cout << arr[i]; cout << endl; }
- using namespace std;
- void merge(int *arr, int left, int mid, int right)
- {
- int i, j,k;
- int numL = mid – left + 1;
- int numR = right – mid;
- int *arrL = new int[numL+1];
- int *arrR = new int[numR+1];
- for (i = 0; i < numL; i++) //将数组左边的数复制到arrL中
- {
- arrL[i] = arr[left+i];
- //cout << arrL[i];
- }
- arrL[i] = 1000000000; //放置一个极大的数,用来作哨兵牌
- for (j = 0; j < numR; j++) //将数组右边的数复制到arrR中
- {
- arrR[j] = arr[mid +1+ j];
- //cout << arrR[j];
- }
- arrR[j] = 1000000000;
- i = j = 0;
- for ( k = left;k<=right;k++) //将数组arr从小到大排序
- {
- if (arrL[i] <= arrR[j]) //如果arrL[i]小于等于arrR[j]
- {
- arr[k] = arrL[i];
- i++;
- }
- else
- {
- arr[k] = arrR[j];
- j++;
- }
- }
- }
- void mergeSort(int *arr, int left, int right)
- {
- int mid;
- if (left < right)
- {
- mid = (left + right) / 2; //获取中间数
- mergeSort(arr, left, mid); //分解数组左边
- mergeSort(arr,mid+1,right); //分解数组右边
- merge(arr, left, mid, right); //合并
- }
- }
- int main()
- {
- int arr[8] = {2,4,5,7,1,2,3,6};
- mergeSort(arr, 0, 7);
- //merge(arr,0,3,7);
- for (int i = 0; i < 8; i++)
- cout << arr[i];
- cout << endl;
- }