各类排序算法汇总

各类排序算法汇总

问题描述

排序问题作为算法的入门内容,我们接触的很多算法或者数据结构的相关书籍总是花费对排序算法进行详细讲解,我在最近看一些算法的时候将看到的排序算法都进行了实现,贴出来与大家交流,同时也算是自己对这几种算法的一个小结。

C++代码如下

//插入排序
void Insertion_sort(vector<int> nums){
	int key;
	int j;
	for (int i = 1; i < nums.size(); i++){
		key = nums[i];
		j = i - 1;
		while ((j>= 0)&&nums[j]<key){
			nums[j + 1] = nums[j];
			j -= 1;
		}
		nums[j + 1] = key;
	}
	for (int k = 0; k < nums.size(); k++)
		cout << nums[k]<<endl;
}

void Binary_adding(vector<int> nums1, vector<int> nums2){
	vector<int> nums3(nums1.size() + 1,0);
	int flag =0;
	for (int i = nums1.size()-1; i >= 0; i--)
	{
		nums3[i+1] = nums1[i] + nums2[i] + flag;
		if (nums3[i+1] >= 2)
			flag = 1;
		else
			flag = 0;

		nums3[i+1] %= 2;
	}
	nums3[0] = flag;
	for (int i = 0; i < nums1.size(); i++)
	{
		cout << nums1[i]<<" ";
	}
	cout << endl;
	for (int i = 0; i < nums1.size(); i++)
	{
		cout << nums2[i]<<" ";
	}
	cout << endl;
	for (int i = 0; i < nums3.size(); i++)
	{
		cout << nums3[i] << " ";
	}
}
//查找排序
void search_sort(vector<int> nums){
	int j;
	int min;
	int tmp = 0, order=0;
	for (int i = 0; i < nums.size(); i++){
		for (j = i,min = nums[i]; j < nums.size(); j++){			
			if ((j - 1 >= i)&&(nums[j - 1] > nums[j]))
			{
				min = nums[j];
				order = j;
			}
		}
		if (nums[i] != min){
			tmp = nums[i];
			nums[i] = min;
			nums[order] = tmp;
		}
		cout << nums[i] << endl;
	}
}
//归并排序,这个借鉴了网上某位大神的博客内容
void merge(int *data, int p, int q, int r)
{
	int n1, n2, i, j, k;
	int *left = NULL, *right = NULL;

	n1 = q - p + 1;
	n2 = r - q;

	left = (int *)malloc(sizeof(int)*(n1));
	right = (int *)malloc(sizeof(int)*(n2));
	for (i = 0; i<n1; i++)  //对左数组赋值  
		left[i] = data[p + i];
	for (j = 0; j<n2; j++)  //对右数组赋值  
		right[j] = data[q + 1 + j];

	i = j = 0;
	k = p;
	while (i<n1 && j<n2) //将数组元素值两两比较,并合并到data数组  
	{
		if (left[i] <= right[j])
			data[k++] = left[i++];
		else
			data[k++] = right[j++];
	}

	for (; i<n1; i++) //如果左数组有元素剩余,则将剩余元素合并到data数组  
		data[k++] = left[i];
	for (; j<n2; j++) //如果右数组有元素剩余,则将剩余元素合并到data数组  
		data[k++] = right[j];
}

void mergeSort(int *data, int p, int r)
{
	int q;
	if (p < r) //只有一个或无记录时不须排序   
	{
		q = (int)((p + r) / 2);      //将data数组分成两半     
		mergeSort(data, p, q);   //递归拆分左数组  
		mergeSort(data, q + 1, r); //递归拆分右数组  
		merge(data, p, q, r);    //合并数组  
	}
}
//计数排序,这种排序以空间换时间,时间复杂度为Θ(k+n)
void counting_sort(vector<int> A,int max_value)
{
	vector<int> C(max_value+1,0);
	vector<int> B(A.size()+1, 0);
	vector<int> D(max_value+1, 0);
	A.push_back(A[0]);
	for (int i = 1; i < A.size() ; i++)
		C[A[i]]++;
	for (int i = 1; i < C.size(); i++)
		D[i] =D[i-1]+ C[i];
	for (int i = 1; i < A.size(); i++)
	{
		B[D[A[i]]] = A[i];
		D[A[i]]--;
	}
	for (int i = 1; i < B.size(); i++)
		cout << B[i] << endl;
}

总结

由于代码是在同一个文件中反复修改实现的,所以没有贴出来完整的代码,只是给出了算法实现的函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值