(五) 归并排序
实现代码:
/*!
* implemented by mengzhaofeng
*/
void merge_sort(int *data, int left, int right, int *temp)
{
if(left == right) return ;
if(right-left == 1) {
if(data[left] > data[right]) {
int tmp = data[left];
data[left] = data[right];
data[right] = tmp;
}
return ;
}
int m = ((left + right) / 2);
merge_sort(data, left, m, temp);
merge_sort(data, m+1, right, temp);
//merge
int i = left;
int k = left;
int j = m + 1;
while(i <= m) {
if(j <= right) {
if(data[i] < data[j]) {
temp[k++] = data[i++];
} else {
temp[k++] = data[j++];
}
} else break;
}
while(i <= m) {
temp[k++] = data[i++];
}
while(j <= right) {
temp[k++] = data[j++];
}
i = left;
j = left;
while(i <= right) {
data[i++] = temp[j++];
}
}
/*!
* 归并排序
*/
double MergeSort(int *data, int size)
{
double res = 0;
boost::scoped_array<int> temp(new int[size]);
//EClock<> Ek;
merge_sort(data, 0, size-1, temp.get());
//res = Ek.microsecond();
return res;
}
测试结果:
单位:us
10 | 0.301869933 |
20 | 0.603739867 |
50 | 2.113089533 |
100 | 4.528049 |
200 | 9.659837866 |
500 | 25.05520446 |
1000 | 55.54406773 |
2000 | 115.3143145 |
3000 | 238.1753774 |
4000 | 252.6651342 |
5000 | 328.1326175 |
6000 | 399.3739218 |
7000 | 469.1058764 |
8000 | 520.7256349 |
9000 | 602.5323869 |
10000 | 719.9597909 |
20000 | 1446.56072 |
50000 | 3970.495233 |
100000 | 8842.374086 |
200000 | 19943.94275 |
500000 | 51415.99639 |
800000 | 83584.16209 |
1000000 | 105334.1927 |