一.选择排序
//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.找局部最小值-类似高数中的极值存在定理(是这名吧?不记得了)
保证两个边界,是一下一上(否则边界为局部最小),判断中值如果不是局部最小,取一下一上一边,迭代。