快速排序和二分查找及其他

快速排序:

#include <stdio.h>
#include <stdlib.h>

void Swap(int *a,int *b)
{
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
}

void QuickSort(int a[],int left,int right)
{
    if(left > right)return;
    int i,j,tmp;
    i = left;
    j = right;
    tmp = a[left];
    while(i!=j)
    {
        while(a[j] >= tmp&&(j>i))j--;
        while(a[i] <= tmp&&(j>i))i++;
        if(i<j)Swap(&a[i],&a[j]);
    }
    a[left] = a[i];
    a[i] = tmp;
    QuickSort(a,left,i-1);
    QuickSort(a,i+1,right);
}

int main()
{
    int arr[10005];
    int n;
    scanf("%d",&n);
    for(int i = 0;i < n;i++)
    {
        scanf("%d",&arr[i]);
    }
    QuickSort(arr,0,n-1);
    for(int i = 0;i < n;i++)
    {
        printf("%d\n",arr[i]);
    }
    return 0;
}

二分查找:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int arr[10005];
    int n,m;
    scanf("%d",&n);
    for(int i = 0;i < n;i++)
    {
        scanf("%d",&arr[i]);
    }
    scanf("%d",&m);
    while(m--)
    {
        int x;
        scanf("%d",&x);
        int low = 0;
        int high = n-1;
        int flag = 1;
        while(low <= high)
        {
            int mid = (low + high)/2;
            if(arr[mid] == x)
            {
                printf("Yes\n");
                flag = 0;
                break;
            }
            else if(arr[mid] > x)
            {
                high = mid - 1;
            }
            else
            {
                low = mid + 1;
            }
        }
        if(flag)printf("No\n");
    }
    return 0;
}

求集合并集:

#include <stdio.h>
#include <stdlib.h>

typedef struct Node{
    int elem[205];
    int last;
}SeqList;

void Init(SeqList *L)
{
    L->last = -1;
}

void Create(SeqList *L,int n)
{
    int i;
    for(i = 0;i < n;i++)
    {
        scanf("%d",&(L->elem[i]));
    }
    L->last = L->last + n;
}

void Merge(SeqList *la,SeqList *lb,SeqList *lc,int n)
{
    for(int i = 0;i <= la->last;i++)
    {
        lc->elem[i] = la->elem[i];
    }
    lc->last = lc->last + n;
    for(int i = 0;i <= lb->last;i++)
    {
        int flag = 0;
        for(int j = 0;j <= la->last;j++)
        {
            if(lb->elem[i]==la->elem[j])
            {
                flag = 1;
                break;
            }
        }
        if(flag == 0)
        {
            lc->elem[++lc->last] = lb->elem[i];
        }
    }
}

int main()
{
    int m,n;
    scanf("%d %d",&m,&n);
    SeqList la,lb,lc;
    Init(&la);
    Init(&lb);
    Init(&lc);
    Create(&la,m);
    Create(&lb,n);
    Merge(&la,&lb,&lc,m);
    for(int i = 0;i <= lc.last;i++)
    {
        printf("%d\n",lc.elem[i]);
    }
    return 0;
}

还是求并集~

#include <stdio.h>
#include <stdlib.h>

int Len_A,Len_B,i;
int A[101],B[101],C[101];

void And_A_B()
{
    int i,j;
    for(j=0;j<Len_A;j++)
        for(i=j+1;i<Len_A;i++)
        {
            if(A[i]==-1) continue;
            if(A[i]==A[j]) A[i]=-1;        //判断A数组内部是否有重合数
        }
    for(j=0;j<Len_B;j++)
        for(i=0;i<Len_A;i++)
        {
            if(B[j]==A[i]) B[j]=-1;             //判断A数组与B数组是否有重合数
        }
}

void Print_Result()
{
    for(i=0;i<Len_A;i++)
    {
        if(A[i]!=-1) printf("%d\n",A[i]);
    }
    for(i=0;i<Len_B;i++)
    {
        if(B[i]!=-1) printf("%d\n",B[i]);
    }
}
int main()
{
    scanf("%d%d",&Len_A,&Len_B);
    for(i=0;i<Len_A;i++) scanf("%d",&A[i]);
    for(i=0;i<Len_B;i++) scanf("%d",&B[i]);
    And_A_B();
    Print_Result();
    return 0;
}

冒泡排序:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int arr[10005];
    int n;
    scanf("%d",&n);
    for(int i = 0;i < n;i++)
    {
        scanf("%d",&arr[i]);
    }
    for(int i = 0;i < n;i++)
    {
        for(int j = 0;j < n-i-1;j++)
        {
            if(arr[j]>arr[j+1])
            {
                int tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
    }
    for(int i = 0;i < n;i++)
    {
        printf("%d\n",arr[i]);
    }
    return 0;
}

插入排序:

#include <stdio.h>
#include <stdlib.h>

void Insertsort(int a[], int n)
{
	int i, j;
	for (i = 1; i < n; i++)
		if (a[i] < a[i - 1])
		{
			int temp = a[i];
			for (j = i - 1; j >= 0 && a[j] > temp; j--)
				a[j + 1] = a[j];
			a[j + 1] = temp;
		}
}
int main()
{
    int arr[10005];
    int n;
    scanf("%d",&n);
    for(int i = 0;i < n;i++)
    {
        scanf("%d",&arr[i]);
    }
    Insertsort(arr,n);
    for(int i = 0;i < n;i++)
    {
        printf("%d\n",arr[i]);
    }
    return 0;
}

归并排序:

#include <iostream>
 
using namespace std;
int a[10000];
int temp[10000];
 
void MergeArray(int a[], int first, int mid, int last, int temp[])
{
    int i = first;  
    int j = mid+1;  
    int m = mid , n = last;
    int k = 0;      

    while(i <= m && j <= n)
    {
        if(a[i] <= a[j])
            temp[k++] = a[i++];
        else
            temp[k++] = a[j++];
    }

    while(i <= m)
        temp[k++] = a[i++];

    while(j <= n)
        temp[k++] = a[j++];
 
    for(i = 0; i < k; i++)
        a[first+i] = temp[i];
}

void MergeSort(int a[], int first, int last, int temp[])
{
    if(first < last)     
    {
        int mid = (first+last)/2;       
        MergeSort(a, first, mid, temp); 
        MergeSort(a, mid+1, last, temp);
        MergeArray(a, first, mid , last, temp);
    }
}
int main()
{
 
    int n;
    cin >> n;
    for(int i = 0; i < n; i ++)
        cin >> a[i];
    MergeSort(a, 0, n-1, temp);
    for(int i = 0; i < n; i++)
        cout << a[i] << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhao2018/article/details/80857984