算法与数据结构知识点总结(1)

来源:互联网 发布:352净化器怎么样 知乎 编辑:程序博客网 时间:2024/05/28 18:43

排序算法

排序算法主要有以下几个较为重要,并且在面试中几乎必考:

  • 快速排序(最重要)

快速排序的主要思路是:

确定一个值v,将其作为分界点。然后以这个值v为分界点,将比v小的值放在v的左边,大的放在右边。然后再分别对左边的子数组和右边的子数组重复这个操作。

编程思路:

对于确定分界点的这个操作而言,其实现方法为:将数组的最左边的元素作为其分界点的值v,然后向后访问。设计索引如下:比v小的值存在数组arr的arr[l … i]的位置,比v大的值存在arr[i+1 … j]的位置。l, i, j的初始值都为传入的参数l,也就是数组的左边界。这样的话,上面的两个数组区间都没有值。

然后访问arr[j+1]的位置,如果arr[j+1] >= v,那么就直接j++,这样就可以将这个新的值纳入到比v大的区间内了。

如果arr[j+1] < v,那么就将arr[i+1]和arr[j+1]进行交换。因为arr[i+1]的值其实就是>v的区间的值,将其交换之后,arr[i+1]这个位置存储的就是

示例代码如下:

// 引入必要头文件/* ******************************* */// 经过这一步的操作之后,arr[l ... p] < v, arr[p+1 ... r]>=p// 返回值为分界点v的索引pint __partition(int arr[], int l, int r) {    int i = l;    int j = l;    int v = arr[l];    while(j < r){        if(arr[j+1] < v){            swap(arr[i+1], arr[j+1]);            j ++;            i ++;        } else {            j ++;        }    }    swap(arr[l], arr[i]);    return i;}// 递归调用,先计算分界点的索引p,然后利用p将数组分为两部分,分别进行递归void __quickSort(int arr[], int l, int r) {    if(l >= r)        return;    int p = __partition(arr, l, r);    __quickSort(arr, l, p);    __quickSort(arr, p+1, r);}// 快速排序的入口函数void quickSort(int arr[], int n) {    int l = 0;    int r = n - 1;        __quickSort(arr, l, r);}int main() {    int arr[10] = {3,5,8,3,5,2,1,7,0,4};    quickSort(arr, 10);    for(int i = 0 ; i < 10 ; i ++){        cout<<arr[i]<<" ";    }    cout<<endl;    return 0;}
  • 归并排序
// 归并排序的关键步骤,将两部分有序数组,归并为一个有序数组// 归并的中间点为mid,即对一个数组的[l ... mid][mid+1 ... r]两部分进行归并。// 归并方法为,申请一个新的数组,比较两个数组中每个元素的大小,按照顺序摆放在新数组中。// 最后将这个新数组复制到原来数组的位置上void __merge(int arr[], int l, int mid, int r) {    int n = r - l + 1;    int arr_new[n];    int j = l;    int k = mid + 1;    for(int i = 0 ; i < n ; i ++){        if(j > mid)            arr_new[i] = arr[k ++];        else if(k > r)            arr_new[i] = arr[j ++];        else if(arr[j] < arr[k])            arr_new[i] = arr[j ++];        else            arr_new[i] = arr[k ++];    }    for(int i = 0 ; i < n ; i ++){        arr[i + l] = arr_new[i];    }}// 拆分的过程,将数组从中间断开,直到每个部分只有一个元素的时候,才会return。// return后,会执行到__merge()操作,也就是将细分的数组进行归并void __mergeSort(int arr[], int l, int r) {    if(l >= r)        return;    int mid = l + (r - l) / 2;    __mergeSort(arr, l, mid);    __mergeSort(arr, mid + 1, r);    __merge(arr, l, mid, r);}void mergeSort(int arr[], int n) {    __mergeSort(arr, 0, n-1);}
  • 选择排序
  • 堆排序

(先占个坑)

查找算法

  • 二分查找