二路归并算法
void mergesort(int a[], int low, int high)
{
if (low < high)//递归结束条件
{
int mid = (low + high) / 2;
mergesort(a, low, mid);
mergesort(a, mid + 1, high);
merge(a, low, mid, high);
}
}
归并算法
将两个有序数组合并为一个有序数组
void merge(int a[], int low, int mid, int high)
{
int n = high - low + 1;
int *b = new int[n + 1];
for (int m= low; m<= high; m++)
b[m] = a[m];//将两个有序数组放入辅助数组中
int i, j, k;
for ( i = low, j = mid + 1, k = i; i <= mid && j <= high; k++)
{
if (b[i] <= b[j])
a[k] = b[i++];
else
a[k] = b[j++];
}//取小者依次加入数组
while (i <= mid)a[k++] = b[i++];
while (j <= high)a[k++] = b[j++];
delete[]b;
}
桶排序
将数组分在有限数量的桶子里
已知数组a的值域[0,max)
遍历数组a,把a的值作为桶的下标,当a[i]被读取时,桶[a[i]]++
遍历结束后,从前往后遍历输出桶中大于0的数
void bucketsort(int a[], int n, int max)
{
int *bucket = new int[max];
int i, j=0;
memset(bucket, 0, max * sizeof(int));
for (i = 0; i < n; i++)
bucket[a[i]]++;//计数
i = 0;
while (max--)//排序
{
while (bucket[j]--)
a[i++] = j;
j++;
}
delete[]bucket;
}
取数组最大值
int get_max(int a[], int n)
{
int max = a[0];
for (int i = 1; i < n; i++)
max = max > a[i] ? max : a[i];
return max;
}
对数组按照某位数进行排序
exp为位数
void count_sort(int a[], int n, int exp)
{
int *output = new int[n];//临时存储的中间数组
int i, bucket[10] = { 0 };
//更改bucket,存储按位数的值
for (i = 0; i != n;i++)
bucket[a[i] / exp % 10]++;
//更改bucket,目的是确定数据在output中的值,也就是应该排第几小
for (i = 1; i != n; i++)
bucket[i] += bucket[i - 1];
//for (i = 0; i < n; i++)//此时是不稳定排序
//因为相同的数比如1,1的话在桶中的储存是0,1,给Output数组赋值的时候是从高到低,因此需要倒序
for(i=n-1;i>=0;i--)//此时是稳定排序
{
output[bucket[a[i] / exp ]- 1] = a[i];//bucket[a[i] / exp ]- 1]表示a[i]按当前位
//排序应该处于位置的下标
bucket[a[i] / exp]--;
}
for (i = 0; i < n; i++)
a[i] = output[i];
delete[]output;
}
基数排序
void radix_sort(int a[], int n)
{
int exp, i;
int max = get_max(a, n);
for (exp = 1; max / exp > 0; exp *= 10)
count_sort(a, n, exp);
}