雜談-常用算法

本文介紹一些常用的簡單算法

冒泡排序

冒泡排序算法的原理如下:
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);
}

持續更新中···

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