排序算法

1.快速排序的递归写法

int partaction(int *a,int left,int right)
{
	int tmp=a[left];
	while(left<right)
	{
		while(right>left&&a[right]>=tmp)//要有等号要不会出现你换过来我换过去的情况发生
		{
			right--;
		}
		a[left]=a[right];
		while(left<right&&a[left]<=tmp)
		{
			left++;
		}
		a[right]=a[left];
	}
	a[left]=tmp;
	return left;
}
int qsort(int *a,int left,int right)
{
	if(left<right)
	{
		int pos=partaction(a,left,right);
		qsort(a,left,pos-1);
		qsort(a,pos+1,right);
	}
}

非递归算法(利用stack和map因为要记录left和right):

算法如下

void qsort(int *a,int left,int right)
{
	stack<pair<int,int>> s;
	s.push(make_pair(left,right));
	while(s.empty())
	{
		pair<int,int> tmp=s.top();
		s.pop();
		int pos=partaction(a,tmp.first,tmp.second);
		s.push(pair<int,int>(tmp.first,pos-1));
		s.push(pair<int,int>(pos+1,tmp.second));
	}
}
归并排序

递归版本

void partaction(int *arr, int left, int middle, int right, int *temp)//每次比较都去获取
{
	int i = left;
	int j = middle + 1;
	int k = 0;
	while (i <= middle&&j <= right)
	{
		if (arr[i]<arr[j])
			temp[k++] = arr[i++];
		else
			temp[k++] = arr[j++];
	}
	while (i>middle&&j <= right)
	{
		temp[k++] = arr[j++];
	}
	while (i <= middle&&j>right)
	{
		temp[k++] = arr[i++];
	}
	k = 0;
	for (int i = left; i <= right; i++, k++)
	{
		arr[i] = temp[k];
	}
}
void mergesort(int *a, int left, int right, int *temp)
{
	if (left<right)
	{
		int middle = (right + left)/ 2;
		mergesort(a, left, middle, temp);
 		mergesort(a, middle + 1, right, temp);
		partaction(a, left, middle, right, temp);

	}
}

非递归版本

void merage(int *a, int left, int right, int *temp)
{
	//最后如果是偶数是好的,如果是基数最后多排一次;
	int i = 0;
	for (int step = 1; step <= right; step = step * 2)
	{
		for (i = 0; i <= right; i = i + 2*step)
		{
			if (i+2*step-1>right||i+step-1>right||i>right)
			{
				break;
			}
			partaction(a, i, i + step - 1, i + 2 * step - 1, temp);
		}
		partaction(a,i,i+step-1, right, temp);//判断多的话就直接最长的一组和当前组比较/并且保证当前组是有序的
	}
	
}

2018/1/31 补充

#include <stdio.h>
int count;
void bubbleSort(int *arr,int len)//冒泡排序 int count
{
	int temp=0;
	int flag;
	for(int i=0;i<len;i++)
	{
		flag=0;
		for(int j=0;j<len-i-1;j++)
		{
			count++;
			if(arr[j]>arr[j+1])
			{
				flag=1;
				temp=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=temp;
			}
		}
		if(flag!=1)
		{
			return ;
		}
	}
}//效率冒泡排序的优话
int partaction(int *arr,int left,int right)
{
	int temp=arr[left];
	while(left<right)
	{
		if(arr[right]>=temp&&right>left)//等号记住我求你了比较是temp不是这个细心的
		{
			right--;
		}
		
		arr[left]=arr[right];
		if(arr[left]<=temp&&right>left)
		{
			left++;
		}
		arr[right]=arr[left];
	}
	arr[left]=temp;
	return left;
}
void qsort(int *arr,int left,int right)
{
		if(left<right)//小于号我求你了两次了
		{
			int middle=partaction(arr,left,right);
			qsort(arr,left,middle-1);
			qsort(arr,middle+1,right);
		}
}
void insertSort(int *arr,int len)//插入排序前面就是已经排列好的稳定
{
	for(int i=0;i<len-1;i++)
	{
			int temp=arr[i+1];
			for(int k=i;k>=0;k--)
			{
				if(temp>arr[k])
				{
						arr[k+1]=temp;
						break;
				}
				arr[k+1]=arr[k];
			}
	}
}
void selectSort(int *arr,int len)//选择排序;;
{
	int temp;
	for(int i=0;i<len-1;i++)
	{
		int min;
		int j;
		min=i;
		for(j=i;j<len;j++)
		{
		   
			if(arr[min]>arr[j])//选择算法不稳定。
			{
				min=j;
			}
		}
		if(min!=i)
		{
			int temp=arr[i];
			arr[i]=arr[min];
			arr[min]=temp;
		}
	}
}
void print(int *arr,int len)
{
	for(int i=0;i<len;i++)
	{
		printf("%d\n",arr[i]);
	}
	printf("count:%d",count);
}
int main()
{
	int arr[20]={1,2,3,45,23,
				 21,22,12,23,22,
				 12,2,4,5,2,
				 2,1,0,-3,2
				};
	int brr[5]={2,3,421,12,23};
	//bubbleSort(arr,20);
	//selectSort(arr,20);
	//insertSort(arr,20);
	qsort(arr,0,19);
	print(arr,20);

}
void heap_adjust(int *arr,int start,int end)
{
	int i;
	int tmp = arr[start];
	for(i=2*start+1; i<=end; i=2*i+1)
	{
		if (i+1<=end && arr[i]<=arr[i+1])//如果有右孩子且右孩子大于左孩子
		{
			i++;
		}

		if (tmp < arr[i])
		{
			arr[start] = arr[i];
			start = i;
		}
		else
		{
			break;
		}
	}
	arr[start] = tmp;
}
void swap(int *x,int *p)
{
	int tmp=*x;
	*x=*p;
	*p=tmp;
}
void heap_sort(int *arr,int len)
{
	for (int i=(len-2)/2; i>=0;i--)
	{
		heap_adjust(arr,i,len-1);
	}
	swap(&arr[0],&arr[len-1]);
	for(int i=len-2;i>0;i--)
	{
		heap_adjust(arr,0,i);
		swap(&arr[0],&arr[i]);
	}
}
int main()
{
	int arr[] = {0,15,2,3,4,132,4,68,1,0,45,213,54,23};
	heap_sort(arr,sizeof(arr)/sizeof(sizeof(arr[0])));
	for (int i = 0; i<sizeof(arr)/sizeof(sizeof(arr[0])); i++)
	{
		printf("%d ",arr[i]);
	}
	return 0;

}
/*基数排序首先要确定的是这个只能是非负数他是一种非比较类型的一种排序法空间换时间
#include <iostream>
#include <vector>
using namespace std;
const int MaxPos=10;//默认最长位数是10位数
int GetBucketNum(int number, int pos)//获取对应的桶号
{
	int temp=1;
	for(int i=0;i<pos-1;i++)
	{
		temp*=10;
	}
	return (number/temp)%10;
}
bool ClearBucket(vector<vector<int>> &bucket)//因为每个桶中的元素个数不一定为1个所以二维采用vector
{
	for(int i=0;i<bucket.size();i++)
	{
		bucket[i].clear();
	}
	return true;
}
void RadixSort(vector<int> &vec)
{
	vector<vector<int>> bucket;
	bucket.resize(10);
	int cnt;
	for(int pos=1;pos<=MaxPos;++pos)
	{
		for(int i=0;i <vec.size();i++)
		{
			int index=GetBucketNum(vec[i],pos);
			bucket[index].push_back(vec[i]);//放到对应的桶中
		}
		cnt =0; //新的数据排列放到桶中
		for(int i=0;i<vec.size();i++)
		{
			for(int j=0;j<bucket[i].size();++j)
			{
				vec[cnt++]=bucket[i][j];
			}
		}
		ClearBucket(bucket);
	}
}
int main()
{
	vector<int> arr;
	arr.resize(10);
	for(int i=0;i<10;i++)
	{
		arr[i]=rand();
	}
	RadixSort(arr);
	auto it=arr.begin();
	for(;it!=arr.end();it++)
	{
		cout<<*it<<endl;
	}
}

个数



Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值