第二章 递归与分治策略算法实现(二分查找、合并排序、快速排序)

2.3 二分搜索技术

#include 

int BinarySearch(int* a,int left,int right,int e)//寻找有序a[n]数组中是否有e元素,若有,返回e的位置;若没有,返回-1
{
	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (a[mid] == e) { return mid; }
		else if (a[mid] < e) { BinarySearch(a, mid + 1, right, e); }
		else if (a[mid] > e) { BinarySearch(a, left, mid -1, e); }
	}
	return -1;
}

void main()
{
	int a[5] = { 3,4,5,6,7 };
	int b;
	b = BinarySearch(a, 0, 4, 5);
	printf("元素5在数组a的第%d位", b+1);
}

在最坏情况下,while循环执行O(logn)次。最坏情况的时间复杂度即为O(logn).

2.7 合并排序

思路:

 代码:有点问题,对题目里的数组可以,再换几个例子就会出问题。找不出来问题,以后再改

更新:改出来了!最重要的问题是在第一个while判断里面,两个条件的前后顺序很重要!

#include 

void Merge(int* a, int* b, int left, int mid, int right)//将a数组的两块在b数组中排序好
{
	int i = left;
	int j = mid + 1;
	int k = 0;
	while (i <= mid && j <= right)
	{
		if (a[i] < a[j])
		{
			b[k] = a[i]; k++; i++;
		}
		if (a[i] > a[j])
		{
			b[k] = a[j]; k++; j++;
		}
		if (a[i] == a[j])
		{
			b[k] = a[i]; k++; i++;
			b[k] = a[j]; k++; j++;
		}
	}
	while (i <= mid)
	{
		b[k] = a[i]; k++; i++;
	}
	while (j <= right)
	{
		b[k] = a[j]; k++; j++;
	}
}

void Copy(int *a,int*b,int left,int right)//将b数组复制到a数组中
{
	int k = 0;
	for (int i = left; i <= right; i++)
	{
		a[i] = b[k]; k++;
	}
}

void MergeSort(int* a, int left, int right)
{
	int b[10];
	if (left < right)
	{
		int mid = (left + right) / 2;
		MergeSort(a, left, mid);
		MergeSort(a, mid + 1, right);
		Merge(a, b, left, mid, right);
		Copy(a, b, left, right);
	}
	else return;
}

void main()
{
	int a[10] = { 24,6,9,1,3,45,4,79};
	MergeSort(a, 0, 7);
	for (int i = 0; i <= 7; i++)
	{
		printf("%d   ", a[i]);
	}
}

2.8  快速排序

第二章 递归与分治策略算法实现(二分查找、合并排序、快速排序)_第1张图片

#include 

void Swap(int a, int b)
{
	int temp = a;
	a = b;
	b = temp;
}

int Partition(int* a, int p, int r)
{
	int i = p;
	int j = r + 1;
	int x = a[p];
	//将比x小的元素交换到左边,大的到右边
	while (true)
	{
		while (a[++i] < x && i < r);
		while (a[--j] > x);
		if (i >= j)break;
		Swap(a[i], a[j]);
	}
	a[p] = a[j];
	a[j] = x;
	return j;
}

void QuickSort(int* a, int p, int r)//排序从a[p]到a[r]
{
	if (p < r)
	{
		int q = Partition(a, p, r);
		QuickSort(a, p, q - 1);
		QuickSort(a, q + 1, r);
	}
}

void main()
{
	int a[10] = { 5,33,9,11,7,6 };
	QuickSort(a, 0, 5);
	for (int i = 0; i <= 5; i++)
	{
		printf("%d    ", a[i]);
	}
}

 这个代码也有点问题,例中的数组可以用,换个数据就不能用了。改不出来为啥有问题,先摆了。以后再回来看。哎。。。

后来改出来了但是懒得找了hhh

你可能感兴趣的:(算法设计,c语言,数据结构)