【数据结构与算法】快速排序
2016-11-15 15:27
162 查看
快速排序也使用了分治策略,它每次将待排序列分成两部分,前一部分的元素值都不比后一部分的元素值大。也就是前一部分都不比某个数大,后一部分都不比这个数小。这个基准的选择会直接影响快速排序的效率。
划分
固定第一个数为基准,以{5,4,3,5,6,12,11,-3,4,5,7}为例,用临时变量保存5,相当于挖了个坑,然后从后往前找到第一个小于基准的数,填入当前坑,原位置形成新坑,然后从前往后找到第一个大于基准的数继续填坑挖坑,最后将基准填入最后的坑。
可以看出不能保证与基准相等的元素会集中到某一边,也不能集中到基准附近
如果基准位置为参数指定,代码为:
尝试很久写出不同思路的代码,但是好像没什么必要
划分
固定第一个数为基准,以{5,4,3,5,6,12,11,-3,4,5,7}为例,用临时变量保存5,相当于挖了个坑,然后从后往前找到第一个小于基准的数,填入当前坑,原位置形成新坑,然后从前往后找到第一个大于基准的数继续填坑挖坑,最后将基准填入最后的坑。
基准为5,蓝色为左指针,红色为右指针 | 操作 |
---|---|
5,4,3,5,6,12,11,-3,4,5,7 | 临时变量保存5,挖第一个坑 |
—,4,3,5,6,12,11,-3,4,5,7 | 从后往前找第一个小于5的 |
4,4,3,5,6,12,11,-3,—,5,7 | 填坑挖坑,从前往后找第一个大于5的 |
4,4,3,5,—,12,11,-3,6,5,7 | 填坑挖坑,从后往前找第一个小于5的 |
4,4,3,5,-3,12,11,—,6,5,7 | 填坑挖坑,从前往后找第一个大于5的 |
4,4,3,5,-3,—,11,12,6,5,7 | 停止挖坑 |
4,4,3,5,-3,5,11,12,6,5,7 | 将5填入最后一个坑 |
private static int partition(int[] nums,int start,int end){ int t=nums[start]; int i=start,j=end; while(i<j){ while(j>i&&nums[j]>=t){ j--; } nums[i]=nums[j]; while(i<j&&nums[i]<=t){ i++; } nums[j]=nums[i]; } nums[i]=t; return i; }
如果基准位置为参数指定,代码为:
private static int partition(int[] nums,int start,int end,int pivot){ int t=nums[pivot]; //基准 int pit=pivot; //坑的位置 int i=start,j=end; while(i<j){ while(j>i&&nums[j]>=t){ j--; } nums[pit]=nums[j]; pit=j; while(i<j&&nums[i]<=t){ i++; } nums[pit]=nums[i]; pit=i; } nums[pit]=t; return pit; }
尝试很久写出不同思路的代码,但是好像没什么必要
private static int partition(int[] nums,int start,int end){ if(start>=end)return start; int t=nums[start]; int i=start+1,j=end; while(i<j){ while(nums[j]>=t&&j>i){ //从后往前找到第一个比t小的 j--; } while(i<j&&nums[i]<t){ //从前往后找到第一个不比t小的,注意是不比t小 i++; } if(i<j){ Swap.swap(nums, i, j); } } //i有可能因为j的原因没有移动也没有比较 if(nums[i]<t){ Swap.swap(nums, start, i); return i; }else{ return i-1; } }
相关文章推荐
- 数据结构与算法之排序:堆排序、归并排序及快速排序
- 【数据结构与算法】排序算法之六:快速排序
- Python 数据结构与算法 —— 从分治的角度看快速排序、归并排序
- 数据结构与算法-----快速排序
- 【数据结构与算法】排序算法——快速排序
- 数据结构与算法——快速排序
- 【数据结构与算法】【排序】快速排序的代码实现
- 【数据结构与算法】快速排序
- 【数据结构与算法】排序算法之六:快速排序
- 数据结构与算法--快速排序
- 数据结构算法之快速排序
- 数据结构之------快速排序
- 数据结构与算法7——高级排序
- [数据结构]原创!amor详解 快速排序 使用以及心得
- 【数据结构与算法】内部排序之二:冒泡排序和选择排序(改进优化,附完整源码)
- [C++]数据结构:排序算法Part2----快速排序、归并排序、箱子排序、基数排序
- 算法:将table标识的树形结构文本数据快速导入Mysql邻接表
- 【数据结构与算法】排序
- 数据结构之排序算法之O(nlogn)
- [C++]数据结构:排序算法Part2----快速排序、归并排序、箱子排序、基数排序