左程云算法第一课初级

一.选择排序

//give arr[],arr_length如何排序?
int mindex;
for(int i=0;i<arr_length;i++)
{
	mindex=i
	for(int j;j<arr_length;j++)
	{
		if (arr[mindex]<arr[j])
			mindex=j;
	}
	int temp=arr[i];
	arr[i]=arr[mindex];
	arr[mindex]=arr[i];
}

二.冒泡排序

//give arr[],arr_length如何排序?
int mindex;
for(int i=arr_length-1;i>0;i--)
{
	for(int j=0;j<i;j++)
	{
		if (arr[j]>arr[j+1])
			int temp=arr[j+1];
			arr[j+1]=arr[j];
			arr[j]=temp;			
	}
	
}

选择排序和冒泡排序时间复杂度是规整的O(n2);不随数据规律而变化,其中选择排序好于冒泡排序,省去了许多不必要的换位。冒泡排序作为排序算法时间复杂度最差的底线存在。
三."^"——异或运算
1.a^b.if (a=0,b0)||(a=1,b1)----a异或b=0;其他一个唯一,一个为零则为异,故a^b=1;
2.两个数字的异或运算是以二进制形式进行的,异或运算也称为不进位的零一运算。
3.异或运算满足交换律,结合律,分配律。本质是不进位的零一运算只与零一个数相关。
4.0^N=N N异或N=0
5.使用异或运算实现数的交换,注意数不能是同一地址。
5.问题1.一个数组,一个数出现奇数次,其他数都出现偶数次。2.二个数出现奇数次,其他数都出现偶数次怎么办?设ero.
ero=a^b,ert=ero&(~ero+1)—>er1=所有能与ert异或等于一异或的结果,
a=eroer1,b=eroa
四.插入排序

for(int i=0;i<arr_length;i++){
	for(int j=i,j>0;j--){
		if(arr[j]>arr[j-1])
			swap(arr[j],arr[j-1])//偷懒,同上
	}
}

O(n2)中最好的算法,情况好的下复杂度仅为n
五.普通二分法

//有序,小到大查找某值.
int fir=0,last=arr_length-1;
while (fir<=last){
	mid=(fir+last)/2;
	if (arr[mid]==num)
		return mid;
	else{
		if (arr[mid]<num)
			fir=mid+1;
		else
			last=mid-1;}

复杂度为log2(n);
2.找某值第一次出现;

int fir=0,last=arr_length-1;
while (fir<=last){
	mid=(fir+last)/2;
	if  (arr[mid]>=num)
		last=mid-1;
	else (arr[mid]<num)
		ir=mid+1;}
3.找局部最小值-类似高数中的极值存在定理(是这名吧?不记得了)
保证两个边界,是一下一上(否则边界为局部最小),判断中值如果不是局部最小,取一下一上一边,迭代。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值