排序算法

  • 直接插入排序
    目标:不减序列。
    A[0:N-1]
    设计思想:
    从后往前查找,找到第i个元素在前面已经排好的序列中找到他应该在的位置pos,将[pos:i]的元素往后移。
    边界条件:
    从第二个元素(也就是下标为1的元素)开始挨个插入到前面已排序好的序列。
    比较继续的条件:被比较的A[j]元素比A[i]元素大
    比较中止执行插入的条件:被比较的A[j]元素不比A[i]元素大
    如何插入:将[pos:i]的元素往后移一个位置。
		for (int i = 1; i < size; i++)
		{
			if (A[i] < A[i - 1])
			{
				int temp = A[i];
				int j;
				for (j = i - 1; j >= 0 && A[j] > temp; j -= 1)
					A[j + 1] = A[j];
				A[j + 1] = temp;
			}
		}
  • 折半插入排序
    设计思想:直接插入排序的查找插入位置和移动分离开。查找插入位置换为折半查找。
  • 希尔排序
	for(int dk=int(size/2);dk>=1;dk=int(dk/2))
		for (int i = dk; i < size; i++)
		{
			if (A[i] < A[i - dk])
			{
				int temp = A[i];
				int j;
				for (j = i - dk; j >= 0 && A[j] > temp; j -= dk)
					A[j + dk] = A[j];
				A[j + dk] = temp;
			}
		}

如果写成下面这样,则会有j<0而没执行A[j+dk]=temp的错误,此时未能将temp赋值给要插入的地方。切记切记!

	for(int dk=int(size/2);dk>=1;dk=int(dk/2))
		for (int i = dk; i < size; i++)
		{
				int temp = A[i];
				for (int j = i - dk; j>=0; j -= dk)
				{
					if (A[j + dk] > temp)
						A[j + dk] = A[j];
					else {
						A[j + dk] = temp;
						break;
					}
				}	
		}
  • 冒泡排序

交换排序之一

	for(int i=size-1;i>=1;i--)
		for(int j=i-1;j>=0;j--)
			if (A[j] > A[i])
			{
				int temp = A[i];
				A[i] = A[j];
				A[j] = temp;
			}
  • 快速排序

交换排序之二

int Partition(int *A, int low, int high)
{
	int pivot = A[low];
	while (low < high)
	{
		while (low<high&&A[high]>=pivot) --high;
		A[low] =A[high];
		while (low < high&&A[low] <= pivot) ++low;
		A[high] = A[low];
	}
	A[low] = pivot;
	return low;
}
void quicksort(int *A, int low, int high)
{
	if (low < high)
	{
		int pivotpos = Partition(A, low, high);
		quicksort(A, low, pivotpos - 1);
		quicksort(A, pivotpos + 1, high);
	}
}

这里low和high的情况如何需要进一步探索研究。

  • 简单选择排序
	for (int i = 0; i < size; i++)
	{
		int min = A[i];
		int min_pos=i;
		for (int j = i + 1; j < size; j++)
		{
			if (A[j] < min)
			{
				min = A[j];
				min_pos = j;
			}

		}
		A[min_pos] = A[i];
		A[i] = min;
	}
  • 堆排序
void adjustdown(int A[], int k, int len)
{
	
	for (int i = 2 * k; i < len; i *= 2)
	{
		int temp = A[k];
		if (A[i] < A[i + 1]&&i+1<len) i++;
		if (A[i] > temp)
		{
			A[k] = A[i];
			k = i;
			A[i] = temp;
		}
	}
}
void bulidmaxheap(int A[], int len)
{
	for (int i = int(len / 2) + 1; i > 0; i--)
		adjustdown(A, i, len);
	for (int i = 1; i < len; i++)
	{
		int temp = A[1];
		A[1] = A[len - i];
		A[len - i] = temp;
		adjustdown(A, 1, len-i);
	}
		
}
  • 归并排序
在这里插入代码片
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值