排序:插入排序,希尔排序,冒泡排序,选择排序,堆排序(C语言)

1.插入排序

//插入排序  
void InsirtSort(int* a, int n)
{
	printf("插入排序:\n");
	for (int i = 1; i < n; i++)
	{
		//假设已经有一个数字并且这个数字本身就是有序
		int end = i - 1;  //从后往前排,好挪动数据
		int tmp = a[i];  //从第二个数据开始也就是a[1]开始排序,因为a[0]本身有序
		while (end >= 0)
		{
			//若大,则挪动数据
			if (a[end] > tmp)
			{
				a[end + 1] = a[end];
				--end;
			}
			else  //否则跳出判断,插入
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
	
}

2.希尔排序

//希尔排序  
void ShellSort(int* a, int n)
{
	printf("希尔排序\n");
	int gap = n;
	while (gap > 0)
	{
		//gap越小越接近1,越接近插入排序,也就越有序
		gap /= 2;

		//并行gap排序
		for (int i = 0; i < n - gap; i++)
		{
			int end = i;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (a[end] > tmp)
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;
		}

	}
}

3. 冒泡排序

//冒泡排序  
void BubbleSort(int* a, int n)
{
	printf("冒泡排序\n");
	for (int j = 0; j < n - 1; j++)
	{
		for (int i = 0; i < n - j - 1; i++)
		{
			if (a[i] > a[i + 1])
			{
				int tmp = a[i + 1];
				a[i + 1] = a[i];
				a[i] = tmp;
			}
		}
	}
	
}

4. 选择排序

//交换函数
void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

//选择排序  
void SelectSort(int* a, int n)
{
	printf("选择排序\n");
	int begin = 0, end = n - 1;
	while (begin < end)
	{
		int maxi = begin, mini = begin;
		for (int i = begin; i <= end; i++)
		{
			//选出最大的位置
			if (a[i] > a[maxi])
			{
				maxi = i;
			}
			//选出最小的位置
			if (a[i] < a[mini])
			{
				mini = i;
			}
		}
		//最小的给头
		Swap(&a[begin], &a[mini]);
		//最大的给尾
		Swap(&a[end], &a[maxi]);

		//缩小排序范围
		begin++;
		end--;
	}
	
}

5. 堆排序

//交换函数
void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}


//向下调整算法
void AdjustDown(int* a, int n, int root)
{
	int parent = root;
	int child = parent * 2 + 1;
	while (child < n)
	{
		if (child + 1 < n && a[child + 1] > a[child])
		{
			child += 1;
		}
		if (a[child] > a[parent])
		{
			Swap(&a[child], &a[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}

//堆排序
void HeapSort(int* a, int n)
{
	printf("堆排序\n");
	int i = 0;
	//建堆  从最后一个叶子节点的父亲节点开始建堆
	for (i = n / 2 - 1; i >= 0; i--)
	{
		AdjustDown(a, n, i);
	}
	//排序
	int end = n - 1;
	for (i = 0; i < n; i++)
	{
		//因为建堆的时候已经进行向下调整,因此数组第一个一定是最大的数 因此直接与最后一个数字交换
		Swap(&a[0], &a[end--]);
		//交换完成后再把数组除了已经换到后面的数字外的数组的第一个进行向下调整
		AdjustDown(a, end, 0);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值