此处不是介绍合并排序原理的,需要说的是,对于自己写排序,特别需要注意其边界,今天就修改边界修改了很久,一方面反映了自己写的还是比较少,另外也和新手们一起学习一下。我写数组有个习惯,可能是看了stl源码剖析的原因,例如这种fun(a, first,last),first指向第一个结点,last指向最后一个结点的下一个结点,但是凡涉及到递归的,以及子程序,这种思想需要统一起来,也就是说不要一个函数调用的是last指向最后一个的下一个,子函数里面却是last指向最后一个,如此会引发不伦不类。
-
#include <iostream>
-
using namespace std;
-
-
void print(int *a, int len)
-
{
-
for(int i = 0; i < len; i++)
-
cout << a[i] << ' ';
-
cout << endl;
-
}
-
-
-
void merge(int *a, int first, int mid, int last) //0 2 5
-
{
-
int n1 = mid - first; //2
-
int n2 = last - mid; //3
-
int k = first;
-
int i = 0, j = 0;
-
int *a1 = new int[n1];
-
int *a2 = new int[n2];
-
-
for(int i = 0; i < n1; i++)
-
a1[i] = a[first+i];
-
for(int i = 0; i < n2; i++)
-
a2[i] = a[mid+i];
-
-
while(i < n1 && j < n2)
-
{
-
if(a1[i] <= a2[j])
-
a[k++] = a1[i++];
-
else
-
a[k++] = a2[j++];
-
}
-
-
while(i < n1)
-
a[k++] = a1[i++];
-
while(j < n2)
-
a[k++] = a2[j++];
-
-
delete a1[];
-
delete a2[];
-
}
-
-
void mergeSort(int *a, int first, int last)
-
{
-
if(first + 1 < last)
-
{
-
int mid = (last + first) / 2;
-
mergeSort(a, first, mid);
-
mergeSort(a, mid, last);
-
merge(a, first, mid, last);
-
}
-
}
-
-
int main()
-
{
-
int a[] = {3, 1, 5, 4, 2, 7, 3, 9, 13, 6, 15, 0};
-
int length = sizeof a / sizeof a[0];
-
mergeSort(a, 0, length);
-
print(a, length);
-
}
阅读(1455) | 评论(0) | 转发(0) |