计数排序
计数排序是一种非比较排序。
count_sort
还会用到相对大小。
节省空间。
前提是遍历数组找到max和min
从而进一步确定range。
然后将数在数组中的相对位置+min对其进行输出。
void count_sort(int* a, int n)
{
int max = a[0], min = a[0],cnt=0;
for (int i = 0; i < n; ++i)
{
if (a[i] > max)
{
max = a[i];
}
if (a[i] < min)
{
min = a[i];
}
}
int range = max - min + 1;
int* count = new int[range];
memset(count, 0, sizeof(int) * range);
for (int i = 0; i < n; ++i)
{
count[a[i] - min]++;
}
for (int j = 0; j < range; ++j)
{
while (count[j]--)
{
a[cnt++] = j + min;
}
}
delete[] count;
}
归并排序
void _merge_sort(int* a, int left,int right,int *tmp)
{
if (left >= right)
{
return;
}
//[left,right]
//[left,mid] [mid+1,right]
int mid = (left + right) >> 1;
_merge_sort(a, left, mid, tmp);
_merge_sort(a, mid + 1, right, tmp);
int begin1 = left, end1 = mid;
int begin2 = mid + 1, end2 = right;
int index = left;//
while (begin1 <= end1 && begin2 <= end2)
{
if (a[begin1] < a[begin2])
{
tmp[index++] = a[begin1++];
}
else
{
tmp[index++] = a[begin2++];
}
}
while (begin1 <= end1)
{
tmp[index++] = a[begin1++];
}
while (begin2 <= end2)
{
tmp[index++] = a[begin2++];
}
for (int i = left; i <= right; ++i)
{
a[i] = tmp[i];
}
}
void merge_sort(int* a, int n)
{
int* tmp = new int[n];
_merge_sort(a, 0, n - 1, tmp);
delete[] tmp;
}
归并排序的核心是其子函数。
通过子函数对其区间进行递归。
左右区间中只有一个数时进行归并。
类似于归并两个有序数组。
归并排序也可以通过非递归实现。
实现是需要注意对区间进行更正。