牛客网初级算法(1)

来源:互联网 发布:二维数组下标越界 编辑:程序博客网 时间:2024/06/06 18:09

冒泡排序

void BubbleSort(int arr[],int n){    if(n==1||n==0) return;    for(int e=n-1;e>0;e--){        for(int i=0;i<e;i++){            if(arr[i]>arr[i+1])                swap(arr,i,i+1);        }    }}void swap(int arr[],int i,int j){    arr[i]=arr[i]^arr[j];    arr[j]=arr[i]^arr[j];    arr[i]=arr[i]^arr[j];}

插入排序

void InsertSort(int arr[],int n){    if(n==1||n==0) return;    for(int i=1;i<n;i++){        for(int j=i-1;j>=0&&arr[j]>arr[j+1];j--)        swap(arr,j,j+1);    }}   

选择排序

void SelectSort(int arr[],int n){    if(n==1||n==0) return;    for(int i=0;i<n-1;i++){        int minIndex=i;        for(int j=i+1;j<n;j++){            minIndex=arr[j]<arr[minIndex]?j:minIndex;        }        swap(arr,i,minIndex);    }}

归并排序

void mergeSort(int arr[],int l,int r){    if(l==r) return;    int mid=l+((r-l)>>1);//防止溢出,>>代表右移一位    mergeSort(arr,l,mid);    mergeSort(arr,mid+1,r);    merge(arr,l,mid,r);}void merge(int arr[],int l,int m,int r){    int help[MAXSIZE];    int i=0,p1=l,p2=m+1;    while(p1<=m&&p2<=r)        help[i++]=arr[p1]<arr[p2]?arr[p1++]:arr[p2++];    while(p1<=m)        help[i++]=arr[p1++];    while(p2<=r)        help[i++]=arr[p2++];    for(i=0;i<sizeof(help)/sizeof(int);i++)        arr[l+i]=help[i];}

快速排序
**要取得[a,b)的随机整数,使用(rand() % (b-a))+ a;
要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a;
要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1;
通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。
要取得a到b之间的随机整数,另一种表示:a + (int)b * rand() / (RAND_MAX + 1)。
要取得0~1之间的浮点数,可以使用rand() / double(RAND_MAX)。**

void QuickSort(int arr[],int l,int r){    if(l<r){    swap(arr,(rand() % (r-l))+ l),r);//随机找到一个数,交换到队尾,防止出现badcase:1 2 3 4 5 6这种情况    int  p[2]=partition(arr,l,r);    quickSort(arr,l,p[0]-1);    quickSort(arr,p[1]+1,r);   }}int partition[](int arr[],int l,int r){    int less=l-1;    int more=r;    while(l<more){        if(arr[l]<arr[r])            swap(arr,++less,l++);        else if(arr[l]>arr[r])            swap(arr,--more,l);        else            l++;    }    swap(arr,more,r);//将选出的part值和大于区的队头交换    int p[2];    p[0]=less+1;    p[1]=more;    return p;}

注:在不申请额外空间的情况下,是很难实现将一个数组中的奇数和偶数分开,并且保持相对顺序不变。