归并排序,桶排序和基数排序

二路归并算法

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);
}

猜你喜欢

转载自blog.csdn.net/weixin_43425693/article/details/89948272