首页 > 编程语言 > 详细

面试算法大汇总

时间:2020-06-03 21:04:08      阅读:34      评论:0      收藏:0      [点我收藏+]

最近为了准备面试,看到许多帖子说考这考那的,我总了一些出现频率比较高的算法。

希望能帮到大家,当然也为以后复习做准备,免得再次找来找去的,另外大家也可多提提意见,我再梳理梳理。

一、常见排序算法:

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);        
    }
}

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

三、单链表常用算法:再膜拜一下 大佬

面试算法大汇总

原文:https://www.cnblogs.com/M-Anonymous/p/13039515.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!