C/C++实现快速排序
来源:互联网 发布:苏宁 算法研究员 面试 编辑:程序博客网 时间:2024/05/01 14:37
快速排序算法(quickSort)是最常用的排序算法之一。关于其思想讲解建议参考:JULY的版本
文章的思想简而言之就是:分治法 + 挖坑填坑
我简单按照(1)存储数组首数字(2)从后向前比较(3)从前向后比较。这样的顺序写了一个版本:
void quickSort(int* arr, int start, int end){if(start == end) return;int key = arr[start];int head = start;int tail = end;while(head != tail){while(key < arr[tail]) tail--;arr[head] = arr[tail];head++;while(key > arr[head]) head++;arr[tail] = arr[head];tail--;}// 此时,head == endquickSort(arr, start, head - 1);quickSort(arr, head + 1, end);return;}
卧槽完全不对好么,死循环。
检查后发现,是因为自己没有注意到因为key保存了一个值,此时的数组中并没有key值(数组值在动态改变)。判断内层while的终点错误。
如果加上 head < tail 的限制。如此一来,while后的操作也该有所选择。
而且,因为当迭代范围仅剩一个数时,quickSort(arr, start, head - 1); 中start > head - 1,无法跳出迭代。同理,quickSort(arr, head + 1, end); 也是。迭代终点需要修改。
最后,key根本没有放回数组。。。
(1)此时,如果不把key值放回数组。则修改之后的代码为:
void quickSort(int* arr, int start, int end){if(start >= end) return;int key = arr[start];int head = start;int tail = end;while(head != tail){while(key < arr[tail] && head < tail) tail--;if(head < tail){arr[head] = arr[tail];head++;}while(key > arr[head] && head < tail) head++;if(head < tail){arr[tail] = arr[head];tail--;}}// 此时,head == endarr[head] = key;quickSort(arr, start, head - 1);quickSort(arr, head + 1, end);return;}
(2)但是,如果把key值放回数组呢?
每次修改及时将key放回,如果head == tail,禁止进行head++或者tail--操作,及时break保存现场)。代码如下:
void quickSort(int* arr, int start, int end){if(start >= end) return;int key = arr[start];int head = start;int tail = end;while(head != tail){while(key < arr[tail]) tail--;if(head == tail) break;arr[head] = arr[tail];arr[tail] = key;head++;while(key > arr[head]) head++;if(head == tail) break;arr[tail] = arr[head];arr[head] = key;tail--;}// 此时,head == endarr[head] = key;quickSort(arr, start, head - 1);quickSort(arr, head + 1, end);return;}
0 0
- 快速排序c实现
- 快速排序C实现
- 快速排序C实现
- 快速排序C实现
- 快速排序(C实现
- 快速排序 C语言实现
- 快速排序C语言实现
- 快速排序算法(c#)实现
- c语言实现快速排序
- C/C++实现快速排序
- C语言实现快速排序
- 快速排序实现(C语言)
- 快速排序C语言实现
- Xcode(C++) 快速排序实现
- C语言实现快速排序
- 快速排序C语言实现
- 快速排序C语言实现
- C语言实现快速排序
- java程序性能优化(从编程习惯)
- 对一个或多个实体的验证失败。有关详细信息,请参见“EntityValidationErrors”属性。
- iOS CGRectGetMaxX/Y 使用
- 解决spring3 mvc中乱码的问题。
- VMware Workstation
- C/C++实现快速排序
- ITK编程笔记
- A20 init.sun7i.rc 文件
- 解决:ImportError: No module named 'xxxx'-------python中关于import语句的认识2
- C语言基础 运算符
- hdu 5102 The K-th Distance
- poj1163The Triangle(DP)
- js 字符串转换成数字的3种方法
- Cocos2d-x 学习(1)—— 通过Cocos Studio创建第一个Demo