排序算法:快速排序(挖坑填数+分治)
2018-03-03 21:34
246 查看
复习一下 浓缩一下 http://blog.csdn.net/morewindows/article/details/6684558这篇文章是必看的
例:72 6 57 88 60 42 83 73 48 85
只需要挖72,然后从85开始向前找一个比72小的,放到72,挖出新坑,从6开始找比大的,找到再挖出新坑,循环即可,直到左右标记位相遇。这样就是完成一次。
然后再对72左边和右边的区间递归,递归终止的条件是要递归的区间中只有一个数。
//快速排序
void quick_sort(int s[], int l, int r)
{
if (l < r)
{
//Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1
int i = l, j = r, x = s[l];
while (i < j)
{
while(i < j && s[j] >= x) // 从右向左找第一个小于x的数
j--;
if(i < j)
s[i++] = s[j];
while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数
i++;
if(i < j)
s[j--] = s[i];
}
s[i] = x;
quick_sort(s, l, i - 1); // 递归调用
quick_sort(s, i + 1, r);
}
}
点评代码:1.如何实现先从右找,找到了再换左找呢?他是放置了一右一左两个while。
2.最后坐标相遇,把初始挖的值放到最后坑位中
3.最后进行左右递归
快速排序搞定!开开心心去面试了!
例:72 6 57 88 60 42 83 73 48 85
只需要挖72,然后从85开始向前找一个比72小的,放到72,挖出新坑,从6开始找比大的,找到再挖出新坑,循环即可,直到左右标记位相遇。这样就是完成一次。
然后再对72左边和右边的区间递归,递归终止的条件是要递归的区间中只有一个数。
//快速排序
void quick_sort(int s[], int l, int r)
{
if (l < r)
{
//Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1
int i = l, j = r, x = s[l];
while (i < j)
{
while(i < j && s[j] >= x) // 从右向左找第一个小于x的数
j--;
if(i < j)
s[i++] = s[j];
while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数
i++;
if(i < j)
s[j--] = s[i];
}
s[i] = x;
quick_sort(s, l, i - 1); // 递归调用
quick_sort(s, i + 1, r);
}
}
点评代码:1.如何实现先从右找,找到了再换左找呢?他是放置了一右一左两个while。
2.最后坐标相遇,把初始挖的值放到最后坑位中
3.最后进行左右递归
快速排序搞定!开开心心去面试了!
相关文章推荐
- 经典排序算法-快速排序(挖坑法、前后指针法)、基数排序
- 基于分治策略的排序算法:合并排序和快速排序
- 排序算法(三)------冒泡排序和快速排序
- 排序算法 之 快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法--快速排序
- 排序算法学习- 快速排序
- 排序算法之快速排序
- 【排序算法】快速排序原理及Java实现
- Java排序算法(四):快速排序
- 常用排序算法笔记之冒泡排序、快速排序
- 简单的排序算法——插入排序,选择排序,交换排序(冒泡排序,快速排序)
- 排序算法复习(1)-- 快速排序
- 算法学习-排序算法-快速排序
- 排序算法总结(6)——快速排序
- C#实现所有经典排序算法(选择排序 冒泡排序 快速排序)
- 排序算法:快速排序
- 排序算法之快速排序
- 【排序算法模板】快速排序