算法与数据结构知识点总结(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);}
- 选择排序
- 堆排序
(先占个坑)
查找算法
- 二分查找
阅读全文
0 0
- 算法与数据结构知识点总结(1)
- 算法与数据结构知识点总结
- 《数据结构与算法分析java语言描述》知识点总结(1-2章)
- 数据结构与算法知识点整理(一)数据结构概述
- 数据结构知识点总结1
- 算法与数据结构总结
- 算法与数据结构总结
- 数据结构与算法总结
- 数据结构与算法总结
- 算法与数据结构总结
- 数据结构与算法总结
- 数据结构与算法总结
- 数据结构与算法总结
- 数据结构与算法(个人总结)
- 讲座总结(数据结构与算法概述)
- 《数据结构与算法分析java语言描述》知识点总结(3-4章)
- 【数据结构与算法】 一些知识点零零总总(引用网络知识点节选重组)
- 数据结构与算法面试总结
- Jenkins启动
- Mac开发之项目中图片管理
- 【python】 python2.7.5 安装pip
- XYOJ 1007 连续多数求和
- easyui-combobox设置值
- 算法与数据结构知识点总结(1)
- Android开发 之 屏幕坐标获取想(x,y)
- R分类算法-KNN算法
- Andy's First Dictionary(P112) / UVA
- 润乾报表横竖连续打印问题
- 安卓学习笔记之Okhttp
- rtsp协议详解
- 如何判断子页面iframe的高度
- jquery.cityselect.js城市插件