杂谈-常用算法

本文介绍一些常用的简单算法

冒泡排序

冒泡排序算法的原理如下:
1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3、针对所有的元素重复以上的步骤,除了最后一个。
4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

冒泡排序总的平均时间复杂度为O(n^2)

void func_a(char *data, char size)
{
    char i,j;
    for(i=0;i<size-1;i++){
        for(j=i+1;j<size;j++){
            if(data[i] > data[j]){
                char tmp = data[j]; 
                data[j] = data[i];
                data[i] = tmp;
            }
        }
    } 
}

int main(int argc, char *argv)
{
    int i;
    char data[] = {1,5,2,3,6,3,3,3,9,111,23,4,6};

    func_a(data, sizeof(data));                               
}
快速排序

快速排序(Quicksort)是对冒泡排序的一种改进。
快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

void func_b(char *data, char left, char right)
{
    char i,j;
    char key;

    if(left >= right) return;
    i = left;
    j = right;
    key = data[left];
    while(i < j){
        while(i < j && key <= data[j]){
            j--;
        }
        data[i] = data[j];

        while(i < j && key >= data[i]){
            i++;
        }

        data[j] = data[i];
    }

    data[i] = key;
    func_b(data, left, i-1);
    func_b(data, i+1, right);
}

合并两个有序数组,并排序
static void func(char *array1,char len1,char *array2,char len2,char *res)  
{
    char i = 0,j = 0,k = 0;

    char min;
    while(i < len1 && j < len2){
        if(array1[i] > array2[j]){
            min = array2[j];
            j++;
        }else{
            min = array1[i];
            i++;
        }
        res[k++] = min;
    }

    while(i < len1)
        res[k++] = array1[i++];

    while(j < len2)
        res[k++] = array2[j++];
}
strstr的实现
char *strstr(const char *str1, const char *str2)
{
    char *cp = (char*)str1;
    char *s1, *s2;
 
    if (!*str2)
        return((char *)str1);
    while (*cp)
    {
        s1 = cp;
        s2 = (char *)str2;
 
        while (*s1 && *s2 && (*s1 == *s2))
            s1++, s2++;
 
        if (!*s2)
            return(cp);
 
        cp++;
    }
    return(NULL);
}

持续更新中···

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章