【代码分享】

//选择排序
void SelectSort(int a[], int n)
{
//count表示有序序列末尾的下标
int count= 0;
int i = 0;
//min为最小值的下标
int min = 0;
while(count {
//每一趟选择排序都从有序数列末尾开始找最小值
min = count;
for (i = count; i {
if (a[min] > a[i])
min = i;
}
//Swap为交换函数
Swap(&a[count], &a[min]);
//每一趟选择排序之后有序数列末尾下标加一
count++;
}
}

堆排序

//建堆
void AdjustDwon(int a[], int n, int i)
{
	int root = i;
	//默认满足条件的是左孩子
	int child = root * 2 + 1;
	while (child < n)
	{
		//如果右孩子更符合条件,就改
		if (child+1<n&&a[child + 1] > a[child])
		{
			child += 1;
		}
		if (a[child] > a[root])
		{
			Swap(&a[child], &a[root]);
			root = child;
			child = root * 2 + 1;
		}
		else
		{
			break;
		}
	}
}

//堆排序
void HeapSort(int a[], int n)
{
	int i = 0;
	for(i = (n-1-1) / 2; i >= 0; i--)
	{
		//一次建堆
		AdjustDwon(a, n, i);
	}
	//建大堆排升序,让数组第一个元素和最后一个与元素交换
	int tmp = n - 1;
	while (tmp > 0)
	{
		Swap(&a[0], &a[tmp]);
		AdjustDwon(a, tmp, 0);
		tmp--;
	}
}

//三数取中
int san(int a[], int left, int right)
{
	int mid = (left + right) / 2;
	if (a[left] > a[right])
	{
		if (a[mid] > a[right])
			return left;
		else if (a[mid] > a[right])
			return mid;
		else
			return right;
	}
	if (a[left] > a[mid])
	{
		if (a[right] > a[left])
			return left;
		else if (a[right] > a[mid])
			return right;
		else
			return mid;
	}
	if (a[mid] > a[right])
	{
		if (a[left] > a[mid])
			return mid;
		else if (a[left] > a[right])
			return left;
		else
			return right;
	}

}

你可能感兴趣的:(c语言)