技术面试手写代码考题--快速排序
来源:互联网 发布:大数据开发工程师招聘 编辑:程序博客网 时间:2024/05/17 21:51
考题2:快速排序(递归与非递归)
基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
快速排序是一种不稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
(一)定轴法(递归):
1.备份对轴(首记录)
2.取两个指针left和right,初始值分别是序列的第二个元素和最后一个元素,并且left<=right
3.移动两个指针
*从right所指的位置向左搜索,找到第一个小于轴的元素,从left所指的位置向右搜索,找到第一个大于轴的元素,找到后如果left
void quickSort(int a[],int first,int last){ if(last <= first) return ; //到了长度小于1这种情况已经是有序列了 int pivot = a[first]; int left = first + 1;//left等于第二个元素 int right = last; int temp; while(left <= right){ while(a[right] > pivot && right >= left)//找到一个比first小的,但必须保证left值小于等于right值 right--; while(a[left] < pivot && left <= right)//找到一个比first大的,但得保证left值小于等于right值 left++; if(left >= right) //说明已经是有序序列,无须交换 break; temp = a[left]; a[left] = a[right]; a[right] = temp; left++,right--; //相应的进一位 } a[first] = a[right];//因为right一定是停在从右到左第一个小于first的数上,交换之后 a[right] = pivot; quickSort(a,first,right-1); quickSort(a,left,last);}
(二)挖坑法(非递归):
1.备份轴记录
2.取两个指针low和high,初始值就是序列的两端下标,保证low<=high
3.移动两个指针
*从high向左找到第一个小于轴的元素, 放在low的位置
*从low向右找到第一个大于轴的元素,放在high的位置
4.重复,直到low=high,
5.把轴放在low所指的位置
6.分别对low所指的位置的左边和右边进行上述的递归
#include <iostream>using namespace std;void quickSort(int a[],int l,int r){ if(l < r){ int low = l; int high = r; int pivot = a[l]; while(low < high){ while(low < high && a[high] >= pivot) high--; if(low < high) a[low++] = a[high]; while(low < high && a[low] < pivot) low++; if(low <high) a[high--] = a[low]; } a[low] = pivot; quickSort(a,l,low-1); quickSort(a,low+1,r); }}int main(){ int a[8] = {34,12,56,47,68,89,59,96}; quickSort(a,0,7); cout<<"非递归"<<endl; int i; for(i = 0;i <=7;i++) cout<<a[i]<<endl; return 0;}
阅读全文
0 0
- 技术面试手写代码考题--快速排序
- 技术面试手写代码考题--二分查找
- 技术面试常被用来作为手写代码的考题汇总
- 快速排序 模板代码 面试
- 手写快速排序
- 手写快速排序
- 手写快速排序
- 手写个快速排序
- 面试手写代码题目
- 归并排序 笔试面试手写代码常考
- 归并排序 笔试面试手写代码常考
- 【C++面试】常考题复习:排序算法
- 手写的qsort快速排序
- 面试手写代码的题目
- 面试常见代码考题总结与详解
- Quicksort 快速排序—注意点以及代码实现(笔试手写代码)
- 【手写排序算法及优化】快速排序
- 手写快速排序【随机数作基数】
- OpenCV图像像素读取及效率分析
- Tensorflow中Tensor类型解析
- 微软的驱动开发的在线帮助文档
- 在Eclipse上打包并使用Proguard工具混淆jar包
- Swift 设置UITextField的placeholder的字体大小、颜色
- 技术面试手写代码考题--快速排序
- Oracle数据库 查询时间在当天内的数据sql
- 在Ubuntu终端输入: sudo apt-get update出现错误
- C#随机数重复的概率
- python单元测试之unittest
- sql server 2012外接excel的数据挖掘学习中
- 升实训一般面试题
- 老工程师教你如何搭建智能家居控制系统
- 迪米特原则