归并排序:
归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略。将已有的子序列合并,得到完全有序的序列。即先使子序列有序,再使子序列段间有序。若将两个有序的表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法。
算法步骤:
- 申请空间,使其大小为两个已排序序列之和,该空间用来存放合并后的序列
- 设定两个指针,最初位置分别为两个已经排序序列的起始位置
- 比较两个指针所指向的元素,选择相对小的元素放入合并空间,并移动相对较小元素的指针到下一个位置
- 重复步骤3直到某一指针达到序列尾
- 将另一个序列剩下的所有元素直接复制到合并序列尾
代码实现:
C++代码实现:
void merge(int numArry[],int left, int mid, int right){
int i = left; //左序列指针;
int j = mid + 1; //右序列指针;
int k = 0; //临时序列指针;
int *temp = new int[right - left + 1];
while(i <= mid && j <= right){
if(numArry[i] <= numArry[j])
temp[k++] = numArry[i++];
else
temp[k++] = numArry[j++];
}
while(i <= mid){ //将左边未存储完的序列存入临时数组
temp[k++] = numArry[i++];
}
while(j <= right){ //将右边未存储完的序列存入临时数组
temp[k++] = numArry[j++];
}
k = 0;
while(left <= right){
numArry[left++] = temp[k++];
}
delete []temp;
}
void merge_sort(int numArry[], int left, int right){
if(left < right){
int mid = (right + left) / 2;
merge_sort(numArry, left, mid);
merge_sort(numArry, mid + 1, right);
merge(numArry, left, mid, right);
}
}