面試算法大彙總

最近爲了準備面試,看到許多帖子說考這考那的,我總了一些出現頻率比較高的算法。

希望能幫到大家,當然也爲以後複習做準備,免得再次找來找去的,另外大家也可多提提意見,我再梳理梳理。

一、常見排序算法:

1、快速排序:例如,若對100個數排序,則 QuickSort(array,0,99),另外爲了整體美觀,swap 函數就不寫,相信大家都會。

void QuickSort(int num[], int start,int end){
    if(start >= end){ 
        return;
    }
    int base = num[start];
    int i = start;
    int j = start + 1;
    while(j <= end){
        if(num[j] < base){
            i++;
            swap(num,i,j);
        }
        j++;
    }
    swap(num,start,i);
    QuickSort(num,start,i-1);
    QuickSort(num,i+1,end);
}

 2、歸併排序:例如,若對100個數排序,則 QuickSort(array,0,99);

void Merge(int num[],int start, int middle, int end){
    int ln = middle - start + 1;
    int rn = end - middle;
    int *left_num = new int[ln];   //記得釋放內存,避免內存泄漏
    int *right_num = new int[rn]; //記得釋放內存,避免內存泄漏
    for(int i = 0; i < ln; i++){
        left_num[i] = num[start+i];
    }
    for(int j = 0; j < rn; j++){
        right_num[j] = num[middle+j+1];
    }
    int i = 0,j = 0,k = start;
    while(i < ln && j < rn){
        if(left_num[i] <= right_num[j]){
            num[k++] = left_num[i++];
        }else{
            num[k++] = right_num[j++];
        }
    }
    while(i < ln){
        num[k++] = left_num[i++];
    }
    while(j < rn){
        num[k++] = right_num[j++];
    }
    delete[] left_num;
    delete[] right_num;
}

void MergeSort(int num[],int start, int end){
    if(start >= end){
        return;
    }
    int middle = (start + end) / 2;
    MergeSort(num,start,middle);  // 拆分
    MergeSort(num,middle+1,end); // 拆分
    Merge(num,start,middle,end); // 歸併
}

3、堆排序(升序):例如,若對100個數排序,則 HeapSort(array,100); swap 函數同樣省略。

void HeapAdjust(int num[], int i, int length){
    for(int j = 2*i + 1; j < length; j = 2*j + 1){
        if(j + 1 < length && num[j] < num [j+1]){
            j++;
        }
        if(num[j] > num[i]){
            swap(num,i,j);
            i = j;
        }
    }
}
void HeapSort(int num[], int length){
    for(int i = length / 2 - 1; i >= 0; i--){  // 構建初始堆
        HeapAdjust(num,i,length);
    }
    for(int i = length - 1; i > 0; i--){
        swap(num,0,i);               // 利用堆頂性質,交換堆頂與末尾元素
        HeapAdjust(num,0,i);        
    }
}

二、二叉樹常用算法:膜拜一下 大佬

三、單鏈表常用算法:再膜拜一下 大佬

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