基本查找与排序算法总结

1. 查找

1.1 二分查找

int BinarySearch (int a[], int n, int key) {
    if (!a) {
        return -1;
    }
    int low=0, high=n-1, mid;
    while (low<=high) {
        mid=(low+high)/2;
        if (a[mid]==key) {
            return mid;
        }
        else if (a[mid]<key) {
            low=mid+1;
        }
        else {
            high=mid-1;
        }
    }
    return -1;
}

2.1 二叉排序树查找

typedef struct BiTNode{
    int data;
    struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;

//二叉排序树查找
int search_bst (BiTree T, int key, BiTree f, BiTree *p) {
    if (!T) {
        *p=f;
        return 0;
    }
    else if (key == T->data) {
        *p=T;
        return 1;
    }
    else if (key<T->data) {
        return search_bst(T->lchild, key, T, p);
    }
    else {
        return search_bst(T->rchild, key, T, p);
    }
}

2. 排序

2.1 冒泡排序

void BubbleSort (int a[], int n) {
    int i, j, k;
    for (i=0; i<n-1; i++) {
        for (j=n-2; j>=i; j--) {
            if (a[j]>a[j+1]) {
                k=a[j];
                a[j]=a[j+1];
                a[j+1]=k;
            }
        }
    }
}

2.2 选择排序

void SelectSort (int a[], int n) {
    int i, j, min, k;
    for (i=0; i<n-1; i++) {
        min=i;
        for (j=i+1; j<=n-1; j++) {
            if (a[min]>a[j]) {
                min=j;
            }
        }
        if (min!=i) {
            k=a[i];
            a[i]=a[min];
            a[min]=k;
        }
    }
}

2.3 插入排序

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

2.4 希尔排序

void ShellSort (int a[], int n) {
    int i, j, k, increment;
    for (increment=(n-1)/3+1; increment>0; increment=increment/3+1) {
        for (i=increment; i<n; i++) {
            if (a[i]<a[i-increment]) {
                k=a[i];
                for (j=i-increment; a[j]>k && j>=0; j-=increment) {
                    a[j+increment]=a[j];
                }
                a[j+increment]=k;
            }
        }
    }
}

2.5 堆排序

void HeapAdjust (int a[], int n, int s, int m) {
    int i, k=a[s];
    for (i=2*(s+1)-1; i<=m; i=2*(i+1)-1) {
        if (i<m && a[i]<a[i+1]) {
            i++;
        }
        if (k>a[i]) {
            break;
        }
        a[s]=a[i];
        s=i;
    }
    a[s]=k;
}

void HeapSort(int a[], int n) {
    int i, k;
    for (i = n/2-1; i>=0; i--) {
        HeapAdjust (a, n, i, n-1);
    }
    for (i=n-1; i>0; i--) {
        k=a[0];
        a[0]=a[i];
        a[i]=k;
        HeapAdjust (a, n, 0, i-1);
    }
    
}

2.6 归并排序

2.6.1 递归实现

void Merge (int temp[], int result[], int first1, int last1, int last2) {
    int first2=last1+1, resultIndex, i;
    for (resultIndex=first1; first1<=last1 && first2<=last2; resultIndex++) {
        if (temp[first1]<temp[first2]) {
            result[resultIndex]=temp[first1++];
        }
        else {
            result[resultIndex]=temp[first2++];
        }
    }
    if (first1<=last1) {
        for (i=0; i<=last1-first1; i++) {
            result[resultIndex+i]=temp[first1+i];
        }
    }
    if (first2<=last2) {
        for (i=0; i<=last2-first2; i++) {
            result[resultIndex+i]=temp[first2+i];
        }
    }
}

void MergeSort (int init[], int result[], int first,int last) {
    int middle, temp[MAXSIZE];
    if (first==last) {
        result[first]=init[first];
    }
    else {
        middle=(first+last)/2;
        MergeSort(init, temp, first, middle);
        MergeSort(init, temp, middle+1, last);
        Merge(temp, result, first, middle, last);
    }
}

2.6.2 非递归实现

void MergePass (int a[],int b[], int s, int n) {
    int i=0, j;
    while (i<=n-2*s) {
        Merge(a, b, i, i+s-1, i+2*s-1);
        i=i+2*s;
    }
    if (i<n-s) {
        Merge(a, b, i, i+s-1, n-1);//最后剩下的个数大于一个s,小于2s
    }
    else {
        for (j=i; j<n; j++) {
            b[j]=a[j];
        }
    }
}

void MergeSort (int a[], int n) {
    int temp[n], k=1;
    while (k<n) {
        MergePass (a, temp, k, n);
        k=2*k;
        MergePass (temp, a, k, n);
        k=2*k;
    }
}

2.7 快速排序

int Partition (int a[], int low, int high) {
    int pivotkey=a[low], k;
    while (low<high) {
        while (low<high && a[high]>=pivotkey) {
            high--;
        }
        k=a[low];
        a[low]=a[high];
        a[high]=k;
        while (low<high && a[low]<=pivotkey) {
            low++;
        }
        k=a[low];
        a[low]=a[high];
        a[high]=k;
    }
    return low;
}

void QuickSort (int a[], int low, int high) {
    int pivot;
    if (low<high) {
        pivot=Partition(a, low, high);
        QuickSort(a, low, pivot-1);
        QuickSort(a, pivot+1, high);
    }
}

2.8 排序算法比较

排序算法比较
排序算法平均情况最好情况最坏情况辅助空间稳定性
冒泡排序O(n^2)O(n)O(n^2)O(1)稳定
选择排序O(n^2)O(n^2)O(n^2)O(1)不稳定
插入排序O(n^2)O(n)O(n^2)O(1)稳定
希尔排序O(nlgn)~O(n^2)O(n^1.3)O(n^2)O(1)不稳定
堆排序O(nlgn)O(nlgn)O(nlgn)O(1)不稳定
归并排序O(nlgn)O(nlgn)O(nlgn)O(n)稳定
快速排序O(nlgn)O(nlgn)O(n^2)O(lgn)~O(n)不稳定
桶排序O(n+c)O(n)O(nlgn)O(n+m)稳定
计数排序O(n+k)O(n+k)O(n+k)O(n+k)稳定
基数排序O(n)O(n)O(n)O(n+k)稳定






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值