经典排序算法(C/C++)

非线性时间比较排序

直接插入排序

void insert_sort(int* A, int n)
{
	if (A == nullptr) return;
	if (n <= 1) return;
	for (int i = 1; i != n; ++i)
	{
		for (int j = i; j > 0; --j)
		{
			if (A[j] < A[j - 1])
			{
				int tmp = A[j];
				A[j] = A[j - 1];
				A[j - 1] = tmp;
			}
		}
	}
}

冒泡排序

void bubble_sort(int* A, int n)
{
	if (A == nullptr) return;
	if (n <= 1) return;
	for (int i = 0; i != n - 1; ++i)
	{
		for (int j = 0; j != n - 1 - i; ++j)
		{
			if (A[j] > A[j + 1])
			{
				int tmp = A[j];
				A[j] = A[j + 1];
				A[j + 1] = tmp;
			}
		}
	}
}

选择排序

void select_sort(int* A, int n)
{
	if (A == nullptr) return;
	if (n <= 1) return;
	int minindex;
	for (int i = 0; i != n - 1; ++i)
	{
		minindex = i;
		for (int j = i + 1; j != n; ++j)
		{
			if (A[j] < A[minindex])
			{
				minindex = j;
			}
		}
		int tmp = A[i];
		A[i] = A[minindex];
		A[minindex] = tmp;
	}
}

希尔排序

void shell_sort(int* A, int n)
{
	if (A == nullptr) return;
	if (n <= 1) return;
	for (int div = n / 2; div >= 1; div /= 2)
		for (int k = 0; k < div; ++k)
			for (int i = div + k; i < n; i += div)
				for (int j = i; j > k; j -= div)
					if (A[j] < A[j - div])
					{
						int tmp = A[j];
						A[j] = A[j - div];
						A[j - div] = tmp;
					}
}

快速排序

void quick_sort(int* A, int left, int right)
{
	if (left >= right) return;
	int i, j, base;
	i = left, j = right;
	base = A[left];
	while (i < j)
	{
		while (A[j] >= base && i < j)
			--j;
		while (A[i] <= base && i < j)
			++i;
		if (i < j)
		{
			int tmp = A[i];
			A[i] = A[j];
			A[j] = tmp;
		}
	}
	A[left] = A[i];
	A[i] = base;
	quick_sort(A,left,i - 1);
	quick_sort(A,i + 1,right);
}

归并排序

void merge(int* A, int p, int q, int r)
{
	int n1 = q - p + 1;
	int n2 = r - q;
	int* B = new int[n1];
	int* C = new int[n2];
	for (int i = p; i <= q; ++i)
	{
		B[i - p] = A[i];
	}
	for (int i = q + 1; i <= r; ++i)
	{
		C[i - q - 1] = A[i];
	}
	B[n1] = INT_MAX;
	C[n2] = INT_MAX;
	int i = 0, j = 0;
	for (int k = p; k <= r; ++k)
	{
		if (B[i] <= C[j])
		{
			A[k] = B[i];
			++i;
		}
		else {
			A[k] = C[j];
			++j;
		}
	}
}


void merge_sort(int* A, int p, int r)
{
	if (p < r)
	{
		int q = (p + r) / 2;
		merge_sort(A,p,q);
		merge_sort(A,q+1,r);
		merge(A,p,q,r);
	}
}

堆排序

void adjust_heap(int* A, int node, int n)
{
	int left = node * 2 + 1;
	int right = node * 2 + 2;
	int max = node;
	if (left < n && A[left] > A[max])
		max = left;
	if (right < n && A[right] > A[max])
		max = right;
	if (max != node)
	{
		int tmp = A[max];
		A[max] = A[node];
		A[node] = tmp;
		adjust_heap(A,max,n);
	}
}	
void make_heap(int* A, int n)
{
	for (int i = n / 2; i >= 0; --i)
	{
		adjust_heap(A,i,n);
	}
}
void heap_sort(int* A, int n)
{
	make_heap(A,n);
	for (int i = n - 1; i >= 0; --i)
	{
		int tmp = A[i];
		A[i] = A[0];
		A[0] = tmp;
		adjust_heap(A,0,i);
	}

}

线性时间的非比较排序

计数排序

void count_sort(vector<int>& A)
{
	if (A.size() <= 1) return;
	int max = *max_element(A.begin(), A.end());
	int min = *min_element(A.begin(),A.end());
	int n = max - min + 1;
	vector<int> B(n,0);
	
	
	for (int i = 0; i != A.size(); ++i)
	{
		++B[A[i] - min];
	}
	for (int i = 0; i != n; ++i)
	{
		for (int j = 0; j != B[i]; ++j)
			cout << i + min << " ";
	}
	cout << endl;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值