肥猫学习日记------查找与排序(一)

查找

普通查找

int order_find(int* arr,size_tlen,int key)
{
	for(int i=0;i<len;i++)
	{
		if(arr[i]==key)
		return i;
	}
	return -1;
}

二分查找(递归)

//二分查找的前提是有序的序列
int binary_find(int* arr,sizt_t l,size_t r,int key)
{
	if(l>r) return -1;//左边的下标大于右边的下标,说明没找到
	int pi=(l+r)/2;
	if(key>arr[pi])
		return binary_find(arr,pi+1,r,key);//因为二分查找前提是有序
	else if(key>arr[pi])
	return binary_find(arr,l,pi-1key);
	else return pi;
}

二分查找(循环)

int binary_find(int* arr,size_t len,int key)
{
	int l=0,r=len-1;
	while(l<=r)
	{
		int pi=(l+r)/2;
		if(key>arr[pi])
			l=pi+1;
		else if(key<arr[pi])
			r=pi-1;
		else
			return pi;
	}
	return -1;
}

排序

由于多个排序均要用到交换,因此我们先定义一个宏函数

#define swap(a,b){typeof(a) t=a;a=b;b=t}

冒泡排序原理
数据基本有序时效率高,对数据的有序性敏感
1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后3、一对。在这一点,最后的元素应该会是最大的数。
4、针对所有的元素重复以上的步骤,除了最后一个。
5、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

void bubble_sort(int*arr,size_t len)
{
	for(int i=len-1;i>0;i--)
	{
		bool flag =true;//定义一个标志位,如果有交换就置否,没有交换就不变
		for(int j=0;j<i;j++)
		{
			if(arr[j]>arr[j+1])
			{
				swap(arr[j],arr[j+1]);
				flag =false;
			}
		}
		if(flag)break;//检查是否排列好,如果数组原本就有序
	}
}

插入排序
如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法
直接插入排序的算法思路:
1、设置监视哨r[0],将待插入记录的值赋值给r[0];
2、设置开始查找的位置j;
3、 在数组中进行搜索,搜索中将第j个记录后移,直至r[0].key≥r[j].key为止;
4、将r[0]插入r[j+1]的位置上。

void insert_sort(int* arr,size_t len)
{
	for(int i=1;i<len;i++)
	{
		int t= arr[i],k=i;
		for(int j=i-1;j>0 &&arr[j]>t;j--)
		{
			arr[j+1]=arr[j];
			k=j;
		}
		arr[k]=t;
	}
}

选择排序
选择排序工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零
选择排序是冒泡排序的一种变种,它没有冒泡对数据有序性的敏感,但它在排序过程中比冒泡排序少了很多数据交换,因此数据比较混乱的情况下要比冒泡排序要快

void select_sort(int* arr,size_t len)
{
	for(int i=len-1;i>0;i--)
	{
		int mac=i;
		for(int j=0;j<len;j++)
		{
			if(arr[j]>arr[max])
			max=j;
		}
		if(max != i)
		swap(arr[max],arr[i]);
	}
}

快速排序
它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

void _quick_sort(int* arr,size_t left,size_t right)
{
	if(left >= right) return;
	int pi=(left+right)/2;
	int pv= arr[pi];
	int l=left,r=right;
	while(l<r)
	{
		while(l<pi && arr[l]<=pv) l++;
		if(l<pi)
		{
			arr[pi]=arr[l];
			pi=l;
		}
		while(pi<r && arr[r]>=pv) r--;
		{
			arr[pi]=arr[r];
			pi =r;
		}
	}
	arr[pi]=pv;
	if(pi=left>1)_quick_sort(arr,left,pi-1);
	if(right-pi>1)_quick_sort(arr,pi+1,right);
}

void quick_sort(int* arr,size_t len)
{
	_quick_sort(arr,0,len-1);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值